假设已经构造了一个单调上升的子序列,那么二分查找出小于当前数的最右边的位置:
假设该位置为k
q[k]<a q[k+1]>=a 插入不会改变单调性,
将a插入到q[k+1]中后,q[1]到q[k+1]还是一个单调上升的子序列
将a插入到q[k+1]中后,不会影响到之后的结果,因为a和原本该位置上的元素有着相同长度的子序列,而且a<=该元素,有着优势
#include<iostream>
using namespace std;
const int N=1e5+10;
int q[N];
int len,n;
int main()
{
cin>>n;
int cnt=0;
for(int i=1;i<=n;i++)
{
int a;
cin>>a;
//二分查找
int l=0,r=len;
while(l<r)
{
int mid=l+r+1>>1;
if(q[mid]<a) l=mid;
else r=mid-1;
}
len=max(len,l+1);
q[l+1]=a;
cnt=max(cnt,l+1);
}
cout<<len; //这里len和cnt其实结果一样
}