分析
由于n的范围为1000,采用I的做法会TLE。用q[i]表示单调序列个数为i的最小数,每次使用二分法来更新q[i]中的最小值。
#include<iostream>
using namespace std;
const int N=100010;
int a[N],q[N];
int n;
int main(){
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
int len=0;
for(int i=0;i<n;i++){
int l=0,r=len;
while(l<r){//二分找到小于a[i]的最大值
int mid=l+r+1>>1;
if(q[mid]<a[i])l=mid;
else r=mid-1;
}
len=max(len,r+1);
q[r+1]=a[i];
}
cout<<len<<endl;
return 0;
}