[TJOI&HEOI2016]seq/[JZOJ4606]序列
来源:互联网 发布:手机上传淘宝主图视频 编辑:程序博客网 时间:2024/06/10 03:11
题目大意
一个长度为
现在你需要求出一个子序列,使得不管发生哪种变换(最多只会发生一种变换,可能不发生),该序列都是不下降的。
题目分析
定义
动态规划
第一个约束顺序解决。
第二三个约束看成二维平面上的点,树套树解决,空间要卡好,不要炸了。我码了棵树状数组套线段树,时间复杂度
然而第二个约束可以使用
代码实现
#include <iostream>#include <cstdio>#include <cctype>using namespace std;int read(){ int x=0,f=1; char ch=getchar(); while (!isdigit(ch)) f=ch=='-'?-1:f,ch=getchar(); while (isdigit(ch)) x=x*10+ch-'0',ch=getchar(); return x*f;}const int S=10050000;const int N=100005;const int A=100000;const int LGA=17;int tmp[LGA];int lowbit(int x){return x&-x;}struct chairman_tree{ int son[S][2],v[S]; int root[A+10]; int tot; int newnode(){return ++tot;} int query(int *rt,int st,int en,int l,int r) { int i,ret=0; if (st==l&&en==r) { for (i=1;i<=rt[0];i++) ret=max(v[rt[i]],ret); return ret; } int mid=l+r>>1,t[LGA]; t[0]=rt[0]; if (en<=mid) { for (i=1;i<=rt[0];i++) t[i]=son[rt[i]][0]; return query(t,st,en,l,mid); } else if (mid+1<=st) { for (i=1;i<=rt[0];i++) t[i]=son[rt[i]][1]; return query(t,st,en,mid+1,r); } else { for (i=1;i<=rt[0];i++) t[i]=son[rt[i]][0]; ret=query(t,st,mid,l,mid); for (i=1;i<=rt[0];i++) t[i]=son[rt[i]][1]; ret=max(query(t,mid+1,en,mid+1,r),ret); return ret; } } void modify(int *rt,int x,int l,int r,int edit) { int i,ret=0; for (i=1;i<=rt[0];i++) { if (!rt[i]) rt[i]=newnode(); v[rt[i]]=max(v[rt[i]],edit); } if (l==r) return; int mid=l+r>>1,t[LGA]; t[0]=rt[0]; if (x<=mid) { for (i=1;i<=rt[0];i++) t[i]=son[rt[i]][0]; modify(t,x,l,mid,edit); for (i=1;i<=rt[0];i++) son[rt[i]][0]=t[i]; } else { for (i=1;i<=rt[0];i++) t[i]=son[rt[i]][1]; modify(t,x,mid+1,r,edit); for (i=1;i<=rt[0];i++) son[rt[i]][1]=t[i]; } }}t;int a[N],mi[N],mx[N],f[N];int n,m,ans;void dp(){ for (int i=1,j,l;i<=n;i++) { for (l=mi[i],tmp[0]=0;l;l-=lowbit(l)) tmp[++tmp[0]]=t.root[l]; f[i]=t.query(tmp,1,a[i],1,A)+1; ans=max(ans,f[i]); for (l=a[i],tmp[0]=0;l<=A;l+=lowbit(l)) tmp[++tmp[0]]=t.root[l]; t.modify(tmp,mx[i],1,A,f[i]); for (l=a[i],j=1;l<=A;j++,l+=lowbit(l)) t.root[l]=tmp[j]; }}int main(){ freopen("sequence.in","r",stdin),freopen("sequence.out","w",stdout); n=read(),m=read(); for (int i=1;i<=n;i++) mi[i]=mx[i]=a[i]=read(); for (int i=1,x,y;i<=m;i++) { x=read(),y=read(); mi[x]=min(mi[x],y),mx[x]=max(mx[x],y); } dp(); printf("%d\n",ans); fclose(stdin),fclose(stdout); return 0;}
0 0
- [TJOI&HEOI2016]seq/[JZOJ4606]序列
- [bzoj4553][TJOI&HEOI2016]序列
- [bzoj4551][TJOI&HEOI2016]树
- [bzoj4552][TJOI&HEOI2016]排序
- [bzoj4552][TJOI&&HEOI2016]排序
- [bzoj4556][TJOI&&HEOI2016]字符串
- [TJOI&HEOI2016]排序
- [bzoj4555][TJOI&HEOI2016]求和
- 【bzoj4555】[TJOI&HEOI2016]求和
- [TJOI&HEOI2016]str/[JZOJ4614]字符串
- [BZOJ4551][JZOJ4604]【TJOI&HEOI2016】D1T1 树
- [BZOJ4552][JZOJ4605]【TJOI&HEOI2016】D1T2 排序
- [BZOJ4554][JZOJ4612] 【TJOI&HEOI2016】D2T1 游戏
- 【TJOI&HEOI2016】bzoj4556 字符串【解法一】
- 【TJOI&HEOI2016】bzoj4556 字符串【解法二】
- Loj2059. 「TJOI / HEOI2016」字符串
- [Ahoi2009]Seq 维护序列seq
- [Ahoi2009]Seq 维护序列seq
- leetcode题解日练--2016.7.12
- 剑指offer 牛客网错题记录 四
- hdu1503 -Advanced Fruits
- 内存映射文件处理大文件
- 输入输出流
- [TJOI&HEOI2016]seq/[JZOJ4606]序列
- 使用virtualenv独立python环境
- KMP再思考
- cf 102 A(暴力)
- FindBugs代码检查工具的使用
- leetcode343 Integer Break java
- C语言中值得深入知识点----数组做函数参数、数组名a与&a区别、数组名a的"数据类型"
- poj 2513 无向图欧拉路+Trie
- untiy 3d ShaderLab_第6章_VertexLit渲染路径_4_顶点照明和Unity存放光源的第三种方式