用 f [ ] 数组记录的是长度为 i 时的末位数为f [ i ]。这样f [] 数组是个单调递增数列,可用二分查找末位小于等于当前数且最长的子序列。
ll find(ll le,ll ri,ll x)
{
while(le<=ri)
{
ll m=(le+ri)>>1;
if(f[m]<=x)
{
le=m+1;
}else
{
ri=m-1;
}
}
return le;
}
ll ans=1;
f[1]=a[1];
ll l,r;
for(ll i=2;i<=num;i++)
{
l=1,r=ans;
ll t=find(l,r,a[i]);
if(t<=ans)
{
f[t]=min(a[i],f[t]);//每次要找最小的那个
}else
{
ans++;
f[ans]=a[i];//若比目前最长不下降子序列末位还大,长度增加
}
}