AcWing 896. 最长上升子序列 II
原题链接
中等
作者:
云_580
,
2024-09-23 20:22:44
,
所有人可见
,
阅读 3
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int n,cnt;
int q[N],a[N];
int find(int k){
int l = 0,r = cnt+1;
while(l+1<r){
int mid = l+r>>1;
if(q[mid]>=k)r=mid;
else l=mid;
}
return r;
}
int main(){
//贪心
cin>>n;
for(int i = 1;i<=n;i++)cin>>a[i];
//这里边界是q[0]
q[0]=-2e9;
for(int i = 1;i<=n;i++){
//贪心,如果大于直接更到后面
if(a[i]>q[cnt])q[++cnt]=a[i];
//如果小于等于找到大于等于a[i]的第一个数并替换它
else q[find(a[i])]=a[i];
}
cout<<cnt;
return 0;
}