二分求最长上升子序列 二分LIS
#include <iostream> #include <cstring> #define N 50010 using namespace std; int n; int num[N],dp[N],c[N]; int LIS(int *d){ memset(c,0,sizeof(c)); c[1]=d[1]; int l,r,mid,len=1; for(int i=2;i<=n;i++){ l=1; r=len; while(l<=r){ mid=(l+r)/2; if(c[mid]<=d[i]) l=mid+1; else r=mid-1; } c[l]=d[i]; if(l>len) len++; } return len; } int main(){ while(cin>>n){ for(int i=0;i<n;i++){ cin>>num[i]; } cout<<LIS(num)<<endl; } return 0; }