d数组:
d[i]表示长度为i的最长上升序列的末尾的最小值
显然d数组单调递增
于是每插入一个i,我们二分找小于它且最大的
假设为d[l]
d[l]<a , d[l+1]>a
因为a可以接在l后面构成长度为l+1,结尾为a的最长上升序列
所以讲d[l+1] 更新成a
答案为tail
#include<bits/stdc++.h>
#define N 100005
using namespace std;
int n,d[N],tail,ans;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int a;scanf("%d",&a);
int l=0,r=tail;
while(l<r){
int mid=(l+r+1)>>1;
if(a>d[mid]) l=mid;
else r=mid-1;
}
if(l>=tail) tail++;
d[l+1]=a;
} cout<<tail<<endl;return 0;
}