最长不下降子序列(n*logn)

来源:互联网 发布:sql注入攻击工具 编辑:程序博客网 时间:2024/05/18 01:06

用 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];//若比目前最长不下降子序列末位还大,长度增加}}


0 0
原创粉丝点击