AcWing 896. 最长上升子序列 II
原题链接
中等
作者:
术
,
2021-03-03 19:53:55
,
所有人可见
,
阅读 206
#include <iostream>
#include <queue>
using namespace std;
int n;
const int N=100005;
int f[N];
int a[N];
int q[N];//不同长度,上升子序列的最小值
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
q[0]=-2e9;
int len=1;
for(int i=1;i<=n;i++){
int l=1,r=len;//二分查找小于等于a[i]的最大子序列长度
while(l<r){
int mid=l+r+1>>1;
if(q[mid]<a[i]) l=mid;
else r=mid-1;
}
len=max(len,r+1);
q[r+1]=a[i];
}
cout<<len-1;
//cout << "Hello world!" << endl;
return 0;
}