LIS+二分法
http://poj.org/problem?id=3903
数列里是存从小到大排的数,二分也是为了这个服务的,不断更新。而len才是所求长度
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #define mem(a) memset(a,0,sizeof(a)) 8 using namespace std; 9 10 int main() 11 { 12 int t,a[100005],f[100005]; 13 while(cin>>t) 14 { 15 for(int i=0;i<t;i++) 16 { 17 scanf("%d",&a[i]); 18 } 19 f[0]=-1; 20 int len=0,l,r,mid; 21 for(int i=0;i<t;i++) 22 { 23 if(a[i]>f[len]) f[++len]=a[i]; 24 else 25 { 26 l=0,r=len; 27 while(l<=r) 28 { 29 mid=((l+r)>>1); 30 if(f[mid]>=a[i]) r=mid-1; 31 else l=mid+1; 32 } 33 f[l]=a[i]; //因为执行l=mid+1的条件就是a[i]大于mid了所以到最后正好能被替换掉的下标就是l或者r+1 34 } 35 } 36 cout<<len<<endl; 37 38 } 39 return 0; 40 }