Description
给一个数组a1, a2 ... an,找到最长的上升降子序列ab1<ab2< .. <abk,其中b1<b2<..bk。
输出长度即可。
Input
第一行,一个整数N。
第二行 ,N个整数(N < = 1000000)
Output
输出K的极大值,即最长不下降子序列的长度
Sample Input
5
9 3 6 2 7
Sample Output
3
HINT
n<=1000000
为了方便大家调试,数据名称已被修改——THREE
/* 维护上升序列c[] 对于a[i],如果比c序列最后一个元素大,直接插入 否则二分查找a[i]在c中的位置,若c[j]<a[i]<c[j+1],则对c[j+1]进行覆盖 序列c的长度即为答案 */ #include<iostream> #include<cstdio> using namespace std; int a[1000010],c[1000010]; int n,cnt,ix; int main(){ scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&a[i]); c[++cnt]=a[1]; for (int i=2;i<=n;i++){ if (a[i]>c[cnt]) c[++cnt]=a[i]; else{ //c[ix]<a[i]<c[ix+1] ix=cnt; for (int l=0,r=cnt;l<=r;){ int m=(l+r)/2; if (c[m]>a[i]){ ix=m;r=m-1; }else l=m+1; } if (a[i]>c[ix-1]) c[ix]=a[i]; } } // for (int i=1;i<=cnt;i++) cout<<c[i]<<" "; printf("%d ",cnt); }