#8#10WA 求助------O(nlogn)做法
查看原帖
#8#10WA 求助------O(nlogn)做法
705506
BESTPLAYER楼主2023/2/19 16:06
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n;
struct stick{int len, wid;};
bool cmp(stick a, stick b)
{
    return (a.len == b.len ? a.wid > b.wid : a.len > b.len);
}
int main()
{
    cin >> n;
    vector<stick> info(n);
    for(int i = 0; i < n; i++)
        cin >> info[i].len >> info[i].wid;
    sort(info.begin(), info.end(), cmp);
    //求最少不升子序列个数 == 求最长递增子序列
    //题目样例 2 9 3 1 4
    vector<int> longest;
    for(int i = 0; i < n; i++)
    {
        if(longest.empty() || longest.back() < info[i].wid)
        {
            longest.push_back(info[i].wid);
        }
        else
        {
            // 二分查找:
            // 前一个 <= info[i].wid 当前 > info[i].wid
            // 示例:
            // 数组:2 9 5 1 4
            // 下标:0 1 2 3 4
            int left = 0, right = longest.size() - 1;
            while(left < right)
            {
                int mid = (left + right) / 2;
                if(longest[mid] <= info[i].wid)
                    left = mid + 1;
                else
                    right = mid;
            }
            longest[right] = info[i].wid;
        }
    }
    cout << longest.size() << endl;
    return 0;
}

2023/2/19 16:06
加载中...