题目链接:https://www.luogu.com.cn/problem/T206418
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int MAXN=200000*25; int a[MAXN];//原数列 int b[MAXN];//更新数列 int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } int cnt=0;//当前上升子序列长度 for(int i=1;i<=n;i++){ //b[cnt]:当前最大值 if(a[i]>b[cnt])b[++cnt]=a[i]; else{//如果无法为上升子数列直接增加新数 //对上升子序列的值贪心的减少,该行为存在后效性 int lastIndex=lower_bound(b+1,b+cnt+1,a[i])-b; b[lastIndex]=a[i]; } } printf("%d\n",cnt); return 0; }