题面
题解
最长上升子序列模型,我们只需要从后往前,从前往后分别求一个最长上升子序列,然后取一个最大值即可,这里用的是单调队列二分优化 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;
}