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];int c[1000010]; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); c[1]=a[1]; int cnt=1; for(int i=2;i<=n;i++) { if (a[i]>c[cnt]) c[++cnt]=a[i]; else{ int l=1,r=cnt,mid; while(l<r){ mid=(l+r)/2; if (c[mid]>=a[i]) r=mid; if (c[ mid]<a[i]) l=mid+1; } if (a[i]<c[l]) c[l]=a[i]; } } cout<<cnt; }
时间: 2024-10-26 00:17:12