【NOI2005】【JZOJ 2413】【BZOJ 1500】维护数列
2016-10-26 19:43
309 查看
Description
请写一个程序,要求维护一个数列,支持以下6种操作:(请注意,格式栏中的下划线‘ _ ’表示实际输入文件中的空格)1. 插入 INSERT_posi_tot_c1_c2_…_ctot 在当前数列的第posi个数字后插入tot个数字:c1, c2, …, ctot;若在数列首插入,则posi为0
2. 删除 DELETE_posi_tot 从当前数列的第posi个数字开始连续删除tot个数字
3. 修改 MAKE-SAME_posi_tot_c 将当前数列的第posi个数字开始的连续tot个数字统一修改为c
4. 翻转 REVERSE_posi_tot 取出从当前数列的第posi个数字开始的tot个数字,翻转后放入原来的位置
5. 求和 GET-SUM_posi_tot 计算从当前数列开始的第posi个数字开始的tot个数字的和并输出
6. 求和最大的子列 MAX-SUM 求出当前数列中和最大的一段子列,并输出最大和
Solution
Spaly模板Code
#include <iostream> #include <cstdio> #include <cstdlib> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fod(i,a,b) for(int i=a;i>=b;i--) #define ch0 ch[0] #define ch1 ch[1] using namespace std; const int N=500500,INF=1047483640; int read(int &n) { char ch=' ';int q=0,w=1; for(;(ch!='-')&&((ch<'0')||(ch>'9'));ch=getchar()); if(ch=='-')w=-1,ch=getchar(); for(;ch>='0' && ch<='9';ch=getchar())q=q*10+ch-48;n=q*w;return n; } int n,m,ans,root,a0; struct qqww { int ch[2],fa,v,la,rtt,sum,zc,zcl,zcr,si; qqww():fa(N),la(-INF),zc(-INF),zcl(-INF),zcr(-INF){} }a[N+1]; int zai ; void merge(int q) { a[q].sum=a[q].v+a[a[q].ch0].sum+a[a[q].ch1].sum; a[q].zc=max(a[q].v,max(a[a[q].ch0].zc,max(a[a[q].ch1].zc,max(a[a[q].ch0].zcr,0)+a[q].v+max(a[a[q].ch1].zcl,0)))); a[q].zcl=max(a[a[q].ch0].zcl,(a[q].ch0!=N?a[a[q].ch0].sum:0)+a[q].v+max(0,a[a[q].ch1].zcl)); a[q].zcr=max(a[a[q].ch1].zcr,(a[q].ch1!=N?a[a[q].ch1].sum:0)+a[q].v+max(0,a[a[q].ch0].zcr)); a[q].si=1+a[a[q].ch0].si+a[a[q].ch1].si; } void merge_up(int q){while(q!=N)merge(q),q=a[q].fa;} void putdown(int q) { if(q==N)return; if(a[q].rtt) { swap(a[q].ch0,a[q].ch1);a[q].rtt=0; swap(a[q].zcl,a[q].zcr); a[a[q].ch0].rtt=!a[a[q].ch0].rtt; a[a[q].ch1].rtt=!a[a[q].ch1].rtt; a .rtt=0; } if(a[q].la!=-INF) { a[q].v=a[q].la; a[q].sum=a[q].la*a[q].si; a[q].zc=a[q].zcl=a[q].zcr=max(a[q].sum,a[q].v); a[a[q].ch0].la=a[a[q].ch1].la=a[q].la; a[q].la=-INF; } } bool KIND(int q){return q==a[a[q].fa].ch0;} void rotate(int x) { int y=a[x].fa,e=KIND(x); a[y].ch[!e]=a[x].ch[e];a[a[x].ch[e]].fa=y; if(a[y].fa!=N)a[a[y].fa].ch[y!=a[a[y].fa].ch0]=x; a[x].fa=a[y].fa;a[y].fa=x;a[x].ch[e]=y; merge(y),merge(x); } void Splay(int q,int T) { while(a[q].fa!=T) { if(a[a[q].fa].fa!=T) { if(KIND(q)==KIND(a[q].fa))rotate(a[q].fa); else rotate(q); } rotate(q); } if(T==N)root=q; } int search(int q,int w) { putdown(a[q].ch0),putdown(a[q].ch1); if(w<=a[a[q].ch0].si)return search(a[q].ch0,w); if(w==a[a[q].ch0].si+1)return q; return search(a[q].ch1,w-1-a[a[q].ch0].si); } void Insrt(int S,int m) { Splay(search(root,S),N); // Splay(search(root,S+1),root); S=root;int q; fo(i,1,m) { q=zai[0]?zai[zai[0]--]:++a0;a[q]=a[N-3]; a[q].fa=S,a[q].ch0=N,a[q].ch1=a[S].ch1; a[a[S].ch1].fa=q;a[S].ch1=q; read(a[q].v); S=q; } merge_up(S); } void D_dfs(int q) { if(a[q].ch0!=N)D_dfs(a[q].ch0); if(a[q].ch1!=N)D_dfs(a[q].ch1); zai[++zai[0]]=q; } void DLT(int l,int r) { Splay(search(root,l-1),N); Splay(r=search(root,r+1),root); D_dfs(a[r].ch0); a[r].ch0=N; merge_up(r); } void changev(int l,int r,int e) { Splay(search(root,l-1),N); Splay(r=search(root,r+1),root); a[a[r].ch0].la=e; putdown(a[r].ch0); merge_up(r); } void changertt(int l,int r) { Splay(search(root,l-1),N); Splay(r=search(root,r+1),root); a[a[r].ch0].rtt=1; putdown(a[r].ch0),merge_up(r); } int findsum(int l,int r) { Splay(search(root,l-1),N); Splay(r=search(root,r+1),root); return a[a[r].ch0].sum; } int main() { int q,w,e; read(n),read(m); a[N-3].ch0=a[N-3].ch1=N; a[0].ch0=a[0].fa=N;a .ch0=a .ch1=N;a[0].v=a[N-1].v=-INF; fo(i,1,n)read(a[i].v),a[a[i].fa=i-1].ch1=i,a[i].ch0=N; a[N-1].ch0=a[N-1].ch1=N,a[a .ch1=N-1].fa=n;a[N-1].si=1; a0=n;fod(i,n,0)merge(i); fo(i,1,m) { char ch=getchar(),cha1; while(ch<'A'||ch>'Z')ch=getchar(); cha1=getchar();cha1=getchar(); if(ch=='M'&&cha1=='X') { fo(j,1,5)ch=getchar(); printf("%d\n",a[root].zc); continue; } q=read(q)+1,read(w); if(ch=='I')Insrt(q,w); if(ch=='D')DLT(q,q+w-1); if(ch=='M'&&cha1=='K')q=w+1,read(w),read(e),changev(q,q+w-1,e); if(ch=='R')changertt(q,q+w-1); if(ch=='G')q=w+1,read(w),printf("%d\n",findsum(q,q+w-1)); } return 0; }
相关文章推荐
- 【NOI 2005】【JZOJ 2413】维护数列 平衡树操作模板题
- JZOJ2413 【NOI2005】维护数列
- 【bzoj1500】 noi2005—维护数列
- BZOJ1500: [NOI2005]维修数列 Splay维护序列
- [BZOJ1500][NOI2005]维护数列(无旋Treap)
- JZOJ2413. 【NOI2005】维护数列
- 【jzoj2413】【NOI2005】【维护数列】【splay】
- 【平衡树维护序列】BZOJ1500(NOI2005)[维修数列]题解
- JZOJ 2413. 【NOI2005】维护数列
- NOI 2005 BZOJ 1500 维护数列
- BZOJ 1500([NOI2005]维修数列-Splay的数列维护)
- [BZOJ1500][NOI2005][Splay]维修数列
- BZOJ 1500: [NOI2005] 维修数列
- BZOJ 1500: [NOI2005]维修数列 (splay tree)
- bzoj 1500: [NOI2005]维修数列 -- splay
- BZOJ 1500: [NOI2005]维修数列
- bzoj 1500: [NOI2005]维修数列(splay)
- 【bzoj1500】[NOI2005]维修数列
- _bzoj1500 [NOI2005]维修数列【真·Splay】
- BZOJ 1500 [NOI2005]维修数列(splay)