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;
}