刷百度指数网站,沈阳网站seo优化哪家好,做网站收入怎样,深圳做企业网站正题
题目链接:https://www.luogu.com.cn/problem/P4093 题目大意 nnn个数字#xff0c;每次有一个数字可能和原序列不同#xff0c;但最多只有一个不同。
求所有情况下都满足的最长不降子序列 解题思路
定义maximax_imaxi表示位置iii的最大数#xff0c;minimin_imini…正题
题目链接:https://www.luogu.com.cn/problem/P4093 题目大意
nnn个数字每次有一个数字可能和原序列不同但最多只有一个不同。
求所有情况下都满足的最长不降子序列 解题思路
定义maximax_imaxi表示位置iii的最大数minimin_imini表示位置iii的最小数。
然后有转移方程fimax{fj}1(ai≥maxj,mini≥aj)f_imax\{f_j\}1(a_i\geq max_j,min_i\geq a_j)fimax{fj}1(ai≥maxj,mini≥aj)
可以发现这是一个三维偏序用cdq分治树状数组即可。 codecodecode
#includecstdio
#includecstring
#includealgorithm
#define lowbit(x) (x-x)
using namespace std;
const int N1e510;
int n,m,a[N],b[N],s[N];
int t[N],p[N],f[N],ans;
bool cmp1(int x,int y)
{return b[x]b[y];}
bool cmp2(int x,int y)
{return a[x]a[y];}
void Change(int x,int val){while(xn){t[x]max(t[x],val);xlowbit(x);}return;
}
void Clear(int x){while(xn){t[x]0;xlowbit(x);}return;
}
int Ask(int x){int ans0;while(x){ansmax(ans,t[x]);x-lowbit(x);}return ans;
}
void cdq(int l,int r){if(lr){f[l]max(f[l],1);return;}int mid(lr)1;cdq(l,mid);for(int il;ir;i)p[i]i;sort(pl,pmid1,cmp1);sort(pmid1,pr1,cmp2);int kl;for(int imid1;ir;i){while(kmidb[p[k]]a[p[i]])Change(a[p[k]],f[p[k]]),k;f[p[i]]max(f[p[i]],Ask(s[p[i]])1);}for(int il;imid;i)Clear(a[i]);cdq(mid1,r);return;
}
int main()
{scanf(%d%d,n,m);for(int i1;in;i)scanf(%d,a[i]),b[i]s[i]a[i];for(int i1;im;i){int x,y;scanf(%d%d,x,y);b[x]max(b[x],y);s[x]min(s[x],y);}cdq(1,n);for(int i1;in;i)ansmax(ans,f[i]);printf(%d,ans);
}