最长下降子序列优化

来源:互联网 发布:骑士夺冠 知乎 编辑:程序博客网 时间:2024/06/06 19:09

预热

 我们知道了$O(n^2)$的最长下降子序列方法,也知道树状数组版的方法,那么今天我又学了另一种方法(二分)。

方法

设P[i]表示这个最长下降子序列的第i个数,那么,对于要处理的a[i],通过二分求出它能够插入到p数组的哪个位置,然后还有可能使这个子序列变长。

代码

p[0]=2147483647;p[1]=a[1];ans=1;fo(i,2,n){    l=0;r=ans;    while (l<r)    {        mid=(l+r)/2;        if (a[i]<p[mid]) l=mid+1;else r=mid;    }    mid=(l+r)/2;    while (a[i]>p[mid]) mid--;    while (a[i]<p[mid]) mid++;    p[mid]=a[i];    if (mid==ans+1) ans++;}printf("%d",ans);
3 0