LIS 树状数组优化

匿名 (未验证) 提交于 2019-12-03 00:14:01

 

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; }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!