• LIS 树状数组优化


    lis  即最长上升子序列

    可以用dp求解 复杂度O(n^2) 

    我们考虑优化 用树状数组(或者线段树)

    树状数组维护区间最大值

    (省去原始O(n^2)算法中的查找)

    这样还能求出以i结尾的lis

    二分只能求出当前序列的lis 

    (许多题里要求lis个数什么的qwq 总之比二分方便 除了码量长

    还有一个小点就是可能会用到离散化(传送门

    具体实现看代码

    #include<bits/stdc++.h>
    using namespace std;
    int a[mxn],b[mxn],n,sz,ans;
    int dp[mxn],f[mxn];
    int lowbit(int x){
        return x&(-x);
    }
    inline void motify(int x,int w){
        for(;x<=sz;x+=lowbit(x)){
            f[x]=max(f[x],w);
        }
    }
    int get(int x){
        int temp=0;
        for(;x;x-=lowbit(x)){
            temp=max(temp,f[x]);
        }
        return temp;
    } 
    int main(){
        cin>>n;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            b[i]=a[i];
        }
        sort(b+1,b+n+1);
        sz=unique(b+1,b+n+1)-(b+1);
        for(int i=1;i<=n;i++){
            a[i]=lower_bound(b+1,b+sz+1,a[i])-b;
        }
        ans=0;
        for(int i=1;i<=n;i++){
            dp[i]=get(a[i]-1)+1;//最长上升 
    //        dp[i]=get(a[i])+1;//最长不下降 
            ans=max(ans,dp[i]);
            motify(a[i],dp[i]);
        }
        cout<<ans;
        return 0;
    }
  • 相关阅读:
    【tyvj1952】easy
    【noip2005】篝火晚会
    BZOJ4818: [Sdoi2017]序列计数
    BZOJ2436: [Noi2011]Noi嘉年华
    BZOJ4826: [Hnoi2017]影魔
    BZOJ4540: [Hnoi2016]序列
    BZOJ4827: [Hnoi2017]礼物
    BZOJ3527: [Zjoi2014]力
    BZOJ4407: 于神之怒加强版
    BZOJ1854: [Scoi2010]游戏
  • 原文地址:https://www.cnblogs.com/duojiaming/p/11671001.html
Copyright © 2020-2023  润新知