模板题

之前还写了点铺垫题

bzoj3223 教你如何reverse

bzoj1507 教你如何维护序列

bzoj1269 教你如何维护序列&reverse

然后再做这个题就好多啦

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define N 500005using namespace std;
inline int read(){int ret=0;char ch=getchar();bool flag=0;while (ch<'0' || ch>'9'){flag=ch=='-';ch=getchar();}while ('0'<=ch && ch<='9'){ret=ret*10-48+ch;ch=getchar();}return flag?-ret:ret;
}struct Splay{#define ls(a) (t[a].c[0])#define rs(a) (t[a].c[1])int root;int q[4000006],qh,qt;struct SPLAYnode{int c[2],fa,size;int data,sum,lsum,rsum,maxsum;bool rev,tag;int num;} t[N];int newnode(){int ret=q[++qh];t[ret].fa=ls(ret)=rs(ret)=t[ret].rev=t[ret].tag=0;t[ret].size=1;return ret;}void load(){qh=qt=0;ls(0)=rs(0)=t[0].rev=t[0].tag=t[0].sum=t[0].lsum=t[0].rsum=t[0].maxsum=0;t[1].data=-1001;for (int i=1;i<=500000;++i) q[++qt]=i;t[root=newnode()].size=1;}void renew(int x){t[x].size=t[ls(x)].size+t[rs(x)].size+1;t[x].sum=t[ls(x)].sum+t[rs(x)].sum+t[x].data;t[x].lsum=t[ls(x)].sum+t[x].data+max(t[rs(x)].lsum,0);if (ls(x)) t[x].lsum=max(t[x].lsum,t[ls(x)].lsum);t[x].rsum=t[rs(x)].sum+t[x].data+max(t[ls(x)].rsum,0);if (rs(x)) t[x].rsum=max(t[x].rsum,t[rs(x)].rsum);t[x].maxsum=t[x].data+max(t[ls(x)].rsum,0)+max(t[rs(x)].lsum,0);if (ls(x)) t[x].maxsum=max(t[x].maxsum,t[ls(x)].maxsum);if (rs(x)) t[x].maxsum=max(t[x].maxsum,t[rs(x)].maxsum);}int f(int x){return (ls(t[x].fa)!=x)*(1-2*(rs(t[x].fa)!=x));}void fill(int x,int value){t[x].tag=1;t[x].num=value;t[x].data=value;t[x].sum=value*t[x].size;t[x].lsum=t[x].rsum=t[x].maxsum=max(t[x].sum,value);}void rever(int x){t[x].rev^=1;swap(ls(x),rs(x));swap(t[x].lsum,t[x].rsum);}void PushDown(int x){if (t[x].rev){t[x].rev^=1;rever(ls(x));rever(rs(x));}if (t[x].tag){if (ls(x)) fill(ls(x),t[x].num);if (rs(x)) fill(rs(x),t[x].num);t[x].tag=0;}}void rotate(int x){int y=t[x].fa,z=t[y].fa,k=f(x),fz=f(y);if (fz>=0) t[z].c[fz]=x;t[y].c[k]=t[x].c[k^1];t[x].c[k^1]=y;t[t[y].c[k]].fa=y;t[x].fa=z;t[y].fa=x;renew(y);renew(x);}int stack[N],top;void splay(int x){top=0;stack[top++]=x;for (int i=x;f(i)>=0;i=t[i].fa) stack[top++]=t[i].fa;while (top) PushDown(stack[--top]);for (root=x;f(x)>=0;rotate(x))if (f(t[x].fa)==f(x)) rotate(t[x].fa);else if (f(t[x].fa)>=0) rotate(x);}int findk(int k){int x=root;for (PushDown(x);t[ls(x)].size+1!=k;PushDown(x))if (t[ls(x)].size+1<k){k-=t[ls(x)].size+1;x=rs(x);}else x=ls(x);return x;}void reverse(int l,int r){l=findk(l);r=findk(r);splay(l);int tmpl=ls(l);ls(l)=0;renew(l);splay(r);int tmpr=rs(r);rs(r)=0;renew(r);rever(r);splay(l);t[rs(l)=tmpr].fa=l;renew(l);splay(r);t[ls(r)=tmpl].fa=r;renew(r);}void ins(int cnt){int now=0;while (cnt--){int tmp=newnode();t[now].fa=tmp;t[tmp].data=read();ls(tmp)=now;renew(now=tmp);}PushDown(root);int tmp=rs(root);PushDown(tmp);rs(now)=tmp;t[tmp].fa=now;renew(now);rs(root)=now;t[now].fa=root;renew(root);}void release(int x){if (!x) return;q[++qt]=x;release(ls(x));release(rs(x));}void del(int l,int r){l=findk(l);r=findk(r);splay(r);int tmp=rs(r);rs(r)=0;renew(r);splay(l);swap(rs(l),tmp);t[rs(l)].fa=l;renew(l);release(tmp);}void update(int l,int r){l=findk(l);r=findk(r);splay(l);int tmpl=ls(l);ls(l)=0;renew(l);splay(r);int tmpr=rs(r);rs(r)=0;renew(r);fill(r,read());splay(l);t[ls(l)=tmpl].fa=l;renew(l);splay(r);t[rs(r)=tmpr].fa=r;renew(r);}void getsum(int l,int r){if (l>r){puts("0");return;}l=findk(l);r=findk(r);splay(l);int tmpl=ls(l);ls(l)=0;renew(l);splay(r);int tmpr=rs(r);rs(r)=0;renew(r);printf("%d\n",t[r].sum);splay(l);t[ls(l)=tmpl].fa=l;renew(l);splay(r);t[rs(r)=tmpr].fa=r;renew(r);}
} s;int main(){s.load();int now=1,tmp=read(),Q=read();s.ins(tmp);while (Q--){char op=getchar();while (!isalpha(op)) op=getchar();char op2=getchar();op2=getchar();if (op=='M'&&op2=='X'){printf("%d\n",s.t[s.root].maxsum);for (int i=0;i<4;++i) getchar();continue;}s.splay(s.findk(now=read()+1));if (op=='M') s.update(now,now+read()-1);else if (op=='R') s.reverse(now,now+read()-1);else if (op=='I') s.ins(read());else if (op=='D') s.del(now-1,now+read()-1);else if (op=='G') s.getsum(now,now+read()-1);}return 0;
}

  

到现在刚学splay,还是太弱了TAT

转载于:https://www.cnblogs.com/wangyurzee7/p/5129642.html

bzoj1500: [NOI2005]维修数列相关推荐

  1. [BZOJ1500][NOI2005]维修数列(splay)

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 16266  Solved: 5410 [Submit][Sta ...

  2. BZOJ1500 [NOI2005]维修数列(Splay tree)

    [Submit][Status][Discuss] Description 请写一个程序,要求维护一个数列,支持以下 6 种操作: 请注意,格式栏 中的下划线' _ '表示实际输入文件中的空格 Inp ...

  3. 【BZOJ1500】[NOI2005]维修数列 Splay

    [BZOJ1500][NOI2005]维修数列 Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目. 第2 ...

  4. 数据结构之fhq-treap——Chef and Sets,[HNOI2012]永无乡,Play with Chain,[NOI2005]维修数列(结构体版代码)

    因为非常板,所以主要是代码 Tyvj 1728 普通平衡树 Chef and Sets [HNOI2012]永无乡 Play with Chain [NOI2005]维修数列 题目很水,所以可能会出现 ...

  5. [BZOJ 1500] [NOI2005] 维修数列

    题目链接:BZOJ - 1500 题目分析 我要先说一下,这道题我写了一晚上,然后Debug了一整个白天..........再一次被自己的蒟蒻程度震惊= = 这道题是传说中的Splay维护数列的Bos ...

  6. 1500: [NOI2005]维修数列 (Splay)

    1W1A(inf开太大) #include<algorithm> #include<iostream> #include<cstring> #include< ...

  7. BZOJ 1500 Luogu P2042 [NOI2005] 维护数列 (Splay)

    BZOJ 1500 Luogu P2042 [NOI2005] 维护数列 (Splay) 手动博客搬家: 本文发表于20180825 00:34:49, 原地址https://blog.csdn.ne ...

  8. 数据结构(Splay平衡树):COGS 339. [NOI2005] 维护数列

    339. [NOI2005] 维护数列 时间限制:3 s   内存限制:256 MB [问题描述] 请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线' _ '表示实际 ...

  9. [bzoj1500 维修数列](NOI2005) (splay)

    真的是太弱了TAT...光是把代码码出来就花了3h..还调了快1h才弄完T_T 号称考你会不会splay(当然通过条件是1h内AC..吓傻)... 黄学长的题解:http://hzwer.com/28 ...

最新文章

  1. 九、将cs文件快速的转换成可执行文件和响应文件(配置编译开关的文件)
  2. Docker - 安装
  3. Spark Streaming VS Flink Streaming
  4. LintCode MySQL 1932/1933. 挂科最多的同学 I / II
  5. onvif协议服务器端口,通过onvif协议接入海康、大华NVR步骤
  6. Unable to open log device '/dev/log/main' : No such file or directory it ...
  7. 物件导向比面向对象更准确
  8. 【转载】smobiler说明
  9. SEO:让网站收录更好的十个方法 网站一直不被收录怎么办
  10. python分割图片数字_python实现图片中文字分割效果
  11. Linux 用ssh远程登录及scp传输文件
  12. 华为什么时候能升android10,华为手机什么时候升级安卓Q 华为首批适配Android10机型列表...
  13. linux网络接口是什么,网络接口是什么?What Is A Network Interface?--用Enki学Linux系列(1)...
  14. for循环打印九九乘法表
  15. ArcGIS API For Javascript 4.15 绘制地图:在地图上测距离、测面积和在不同图层上搜索
  16. 数字图像处理-美图秀秀:瘦脸算法
  17. sendmail配置详解
  18. Java 数组元素倒序的三种方式
  19. 微信小程序使用云开发实现微信支付功能 报错Error: 签名错误,史上最全解决办法,不服留言骂我
  20. 自从玩了我自己创造的这个c++游戏后,总感觉一分钟好长(火龙征战V1.0.1)

热门文章

  1. linux下配置Java和Go环境
  2. HDU X问题 中国剩余定理--求满足条件的个数
  3. UBUNTU修改控制台语言
  4. POJ 2449 Remmarguts' Date
  5. div不继承父类样式_Java三大特性之继承
  6. cmd无法运行python_通过Java-%1在cmd中运行python文件不是有效的Win32应用程序 - java...
  7. linux下设置程序后台运行,linux中如何让进程在后台运行
  8. java5错误_Error:java: 错误: 不支持发行版本 5
  9. 上传图片的表单java代码_java模拟post方式提交表单实现图片上传(示例代码)
  10. 3-13其他数学函数