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; }
原文地址:https://www.cnblogs.com/duojiaming/p/11671001.html
时间: 2024-10-07 07:50:27