【LIS,二分】洛谷P3902 递增

链接

https://www.luogu.org/problemnew/show/P3902

大意

求将一个序列转换为严格递增序列的最小次数

思路

求出一个最长上升的子序列,剩下的元素个数即为要修改的次数,由于数据很大,我们需要用到 n l o g n 的方法,其实,在二分查找的每次替换中就可以当作一次修改操作,我们可以利用这个特性直接求出答案,而不必用 n 去减

代码

#include<cstdio>
#include<algorithm>
#define r(i,a,b) for(register int i=a;i<=b;i++)
using namespace std;int a,n,f[100001],ans,len;
int main()
{
    scanf("%d",&n);
    r(i,1,n)
    {
        scanf("%d",&a);
        if(a>f[len]) f[++len]=a;
        else *lower_bound(f+1,f+1+len,a)=a,ans++;//统计修改次数
    }
    printf("%d",ans);
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/81630287