acwing 1017 怪盗基德的滑翔翼 (最长上升子序列)

题面

在这里插入图片描述

题解

最长上升子序列模型,我们只需要从后往前,从前往后分别求一个最长上升子序列,然后取一个最大值即可,这里用的是单调队列二分优化 O(nlogn)

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>

using namespace std;
const int N = 1e5 + 10;

int t, n;
int h[N];
int f[N];

int main() {
    
    

    cin >> t;
    while (t--) {
    
    
        cin >> n;
        for (int i = 1; i <= n; i++) cin >> h[i];

        int res1 = 0;
        for (int i = 1; i <= n; i++) {
    
    
            int l = 0, r = res1;
            while (l < r) {
    
    
                int mid = (l + r + 1) >> 1;
                if (f[mid] < h[i]) l = mid;
                else r = mid - 1;
            }
            res1 = max(r + 1, res1);
            f[r + 1] = h[i];
        }

        for(int i=0;i<N;i++) f[i]=0;
        int res2 = 0;
        for (int i = n; i >= 1; i--) {
    
    
            int l = 0, r = res2;
            while (l < r) {
    
    
                int mid = (l + r + 1)>>1;
                if (f[mid] < h[i]) l = mid;
                else r = mid - 1;
            }
            res2 = max(r + 1, res2);
            f[r + 1] = h[i];
        }

        cout << max(res1, res2) << endl;

    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_44791484/article/details/115099301