LIS 树状数组优化

Posted duojiaming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
}
int motify(int x,int w){
    for(;x<=m;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++){
        scansf("%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;
}

 

以上是关于LIS 树状数组优化的主要内容,如果未能解决你的问题,请参考以下文章

大数据LIS (贪心+二分优化/树状数组优化)

HDU - 5542 The Battle of Chibi(LIS+树状数组优化)

关于LIS和一类可以用树状数组优化的DP 预备知识

[noip科普]关于LIS和一类可以用树状数组优化的DP

poj1631——树状数组求LIS

bzoj5157: [Tjoi2014]上升子序列(树状数组LIS)