[NOI2005]维护数列(luogu)

打这玩意儿真是要了我的老命

Description

请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线‘ _ ’表示实际输入文件中的空格)

Code

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <algorithm>
  4. #define TAGNONE 10000001
  5. using namespace std;
  6. const int N=1e6+;
  7. struct node
  8. {
  9. int size,rev,ch[],res,prer,prel,tag,fa,sum,val;
  10. void clear()
  11. {
  12. size=rev=ch[]=ch[]=res=prer=prel=fa=sum=val=;
  13. tag=TAGNONE;
  14. }
  15. }f[N];
  16. int x,id[N],tot,n,ru[N],rt,pos,len,d[N],m,cnt;
  17. char s[];
  18. int get()
  19. {
  20. if(tot==) return ++cnt;
  21. int x=ru[tot--];
  22. return x;
  23. }
  24. void c_val(int x,int y)
  25. {
  26. if(!x) return ;
  27. f[x].tag=f[x].val=y;
  28. f[x].sum=y*f[x].size;
  29. f[x].prel=f[x].prer=max(,f[x].sum);
  30. f[x].res=max(y,f[x].sum);
  31. }
  32. void c_rev(int x)
  33. {
  34. swap(f[x].ch[],f[x].ch[]);
  35. swap(f[x].prer,f[x].prel);
  36. f[x].rev^=;
  37. }
  38. void push_up(int x)
  39. {
  40. int lc=f[x].ch[],rc=f[x].ch[];
  41. f[x].size=f[lc].size+f[rc].size+;
  42. f[x].sum=f[lc].sum+f[rc].sum+f[x].val;
  43. f[x].res=max(max(f[lc].res,f[rc].res),f[lc].prer+f[rc].prel+f[x].val);
  44. f[x].prel=max(f[lc].prel,f[lc].sum+f[rc].prel+f[x].val);
  45. f[x].prer=max(f[rc].prer,f[rc].sum+f[lc].prer+f[x].val);
  46. }
  47. void push_down(int x)
  48. {
  49. int lc=f[x].ch[],rc=f[x].ch[];
  50. if(f[x].tag!=TAGNONE)
  51. {
  52. c_val(lc,f[x].tag);
  53. c_val(rc,f[x].tag);
  54. f[x].tag=TAGNONE;
  55. }
  56. if(f[x].rev)
  57. {
  58. c_rev(lc),c_rev(rc);
  59. f[x].rev=;
  60. }
  61. }
  62. int kth(int k)
  63. {
  64. int x=rt;
  65. while()
  66. {
  67. push_down(x);
  68. int lc=f[x].ch[],rc=f[x].ch[];
  69. if(f[lc].size+==k) return x;
  70. else if(f[lc].size>=k) x=lc;
  71. else k-=f[lc].size+,x=rc;
  72. }
  73. }
  74. void rotate(int x)
  75. {
  76. int y=f[x].fa,z=f[y].fa;
  77. int wh=(x==f[y].ch[]);
  78. f[f[x].ch[wh^]].fa=y;
  79. f[y].ch[wh]=f[x].ch[wh^];
  80. f[x].ch[wh^]=y;
  81. f[y].fa=x,f[x].fa=z;
  82. if(z) f[z].ch[y==f[z].ch[]]=x;
  83. push_up(y),push_up(x);
  84. }
  85. void splay(int x,int y)
  86. {
  87. for(int fx=f[x].fa;fx=f[x].fa,fx!=y;rotate(x))
  88. if(f[fx].fa!=y) rotate((fx==f[f[fx].fa].ch[])^(x==f[fx].ch[])?x:fx);
  89. if(!y) rt=x;
  90. }
  91. int split(int pos,int len)
  92. {
  93. int x=kth(pos),y=kth(pos+len+);
  94. splay(x,),splay(y,x);
  95. return f[y].ch[];
  96. }
  97. void creat(int x,int y)
  98. {
  99. f[x].val=f[x].sum=f[x].res=y;
  100. f[x].prel=f[x].prer=max(y,);
  101. f[x].rev=,f[x].tag=TAGNONE;
  102. f[x].size=;
  103. }
  104. void build(int l,int r,int fa)
  105. {
  106. int mid=(l+r)>>;
  107. int x=id[mid],fx=id[fa];
  108. if(l==r) creat(x,d[mid]);
  109. if(l<mid) build(l,mid-,mid);
  110. if(mid<r) build(mid+,r,mid);
  111. f[x].tag=TAGNONE,f[x].val=d[mid],f[x].fa=fx;
  112. push_up(x);
  113. f[fx].ch[mid>=fa]=x;
  114. }
  115. void insert(int x,int len)
  116. {
  117. for(int i=;i<=len;i++)
  118. scanf("%d",&d[i]),id[i]=get();
  119. build(,len,);
  120. int a=kth(x+),b=kth(x+);
  121. splay(a,),splay(b,a);
  122. int c=id[(+len)>>];
  123. f[c].fa=b,f[b].ch[]=c;
  124. push_up(b),push_up(a);
  125. }
  126. void remove(int x)
  127. {
  128. if(f[x].ch[]) remove(f[x].ch[]);
  129. if(f[x].ch[]) remove(f[x].ch[]);
  130. ru[++tot]=x,f[x].clear();
  131. }
  132. void eraser(int k,int len)
  133. {
  134. int x=split(k,len),y=f[x].fa;
  135. remove(x);
  136. f[y].ch[]=;
  137. push_up(y),push_up(f[y].fa);
  138. }
  139. void update(int pos,int len,int k)
  140. {
  141. int x=split(pos,len);
  142. c_val(x,k);
  143. push_up(f[x].fa),push_up(rt);
  144. }
  145. void rever(int pos,int len)
  146. {
  147. int x=split(pos,len);
  148. if(f[x].tag!=TAGNONE) return;
  149. c_rev(x);
  150. push_up(f[x].fa),push_up(rt);
  151. }
  152. void query(int pos,int len)
  153. {
  154. int x=split(pos,len);
  155. printf("%d\n",f[x].sum);
  156. }
  157. int main()
  158. {
  159. scanf("%d%d",&n,&m);
  160. f[].res=d[]=d[n+]=-<<;
  161. for(int i=;i<=n;i++) scanf("%d",&d[i+]);
  162. for(int i=;i<=n+;i++) id[i]=i;
  163. build(,n+,);
  164. rt=(n+)>>,cnt=n+;
  165. while(m--)
  166. {
  167. scanf("%s",s);
  168. if(s[]=='M' && s[]=='A' && s[]=='X') printf("%d\n",f[rt].res);
  169. else scanf("%d%d",&pos,&len);
  170. if(s[]=='I') insert(pos,len);
  171. if(s[]=='D') eraser(pos,len);
  172. if(s[]=='M' && s[]=='A' && s[]=='K')
  173. scanf("%d",&x),update(pos,len,x);
  174. if(s[]=='R') rever(pos,len);
  175. if(s[]=='G') query(pos,len);
  176. }
  177. return ;
  178. }

[NOI2005]维护数列(区间splay)的更多相关文章

  1. P2042 [NOI2005]维护数列 && Splay区间操作(四)

    到这里 \(A\) 了这题, \(Splay\) 就能算入好门了吧. 今天是个特殊的日子, \(NOI\) 出成绩, 大佬 \(Cu\) 不敢相信这一切这么快, 一下子机房就只剩我和 \(zrs\) ...

  2. 洛谷 P2042 [NOI2005]维护数列-Splay(插入 删除 修改 翻转 求和 最大的子序列)

    因为要讲座,随便写一下,等讲完有时间好好写一篇splay的博客. 先直接上题目然后贴代码,具体讲解都写代码里了. 参考的博客等的链接都贴代码里了,有空再好好写. P2042 [NOI2005]维护数列 ...

  3. P2042 [NOI2005]维护数列[splay或非旋treap·毒瘤题]

    P2042 [NOI2005]维护数列 数列区间和,最大子列和(必须不为空),支持翻转.修改值.插入删除. 练码力的题,很毒瘤.个人因为太菜了,对splay极其生疏,犯了大量错误,在此记录,望以后一定 ...

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

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

  5. [NOI2005] 维护数列

    [NOI2005] 维护数列 题目 传送门 请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线‘ _ ’表示实际输入文件中的空格) 操作编号 输入文件中的格式 说明 1 ...

  6. Luogu P2042 [NOI2005]维护数列(平衡树)

    P2042 [NOI2005]维护数列 题意 题目描述 请写一个程序,要求维护一个数列,支持以下\(6\)种操作:(请注意,格式栏中的下划线'_'表示实际输入文件中的空格) 输入输出格式 输入格式: ...

  7. [转载]无旋treap:从单点到区间(例题 BZOJ1500&NOI2005 维护数列 )

    转自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182631.html 1500: [NOI2005]维修数列 Time Limit: 10 Sec  Mem ...

  8. [您有新的未分配科技点] 无旋treap:从单点到区间(例题 BZOJ1500&NOI2005 维护数列 )

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MB Description Input 输入的第1 行包含两个数N 和M(M ≤20 ...

  9. 【bzoj1500】 noi2005—维护数列

    http://www.lydsy.com/JudgeOnline/problem.php?id=1500 (题目链接) 题意 要求维护数列,操作有区间删除,区间插入,区间反转,区间修改,区间求和,求最 ...

随机推荐

  1. Maven工程

    maven:父子工程 1,父工程并没有实质性的内容,所有的jar包都在里面,也就是说只需要管理jar包即可,不参与任务方法逻辑 2,在父工程中拥有很多的子模块,每一个子模块都代表了不用的包如(pack ...

  2. Appium中使用相对路径定位元素Xpath

    1.若页面该元素没有ID 2.找出该元素父类,并拷贝出父类的class(类名)和ID 3.点击搜索图标,进行查找 selector内容://android.widget.LinearLayout[@r ...

  3. go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时])

    目录 go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时]) 静态配置 flag注入 在线热加载配置 远程配置中心 go微 ...

  4. 王雅超的学习笔记-大数据hadoop集群部署(十)

    Spark集群安装部署

  5. requests爬取豆瓣top250电影信息

    ''' 1.爬取豆瓣top250电影信息 - 第一页: https://movie.douban.com/top250?start=0&filter= - 第二页: https://movie ...

  6. ABP-AsyncLocal的使用

    1.与AsyncLocal对应的是ThreadLocal 2.两种类型 初始赋值 AsyncLocalString.Value = new List { "1" }; AsyncL ...

  7. flask迁移数据库时报错:Target database is not up的解决方案

    在flask中进行数据库迁移时报错,报错信息为"Target database is not up",解决方案如下 找到alembic的最新版本号,找到文件夹migrate下的最新 ...

  8. Asp.net导入Excel并读取数据

    protected void Button1_Click(object sender, EventArgs e) { if (station.HasFile == false)//HasFile用来检 ...

  9. 【python小随笔】celery异步任务与调用返回值

    s1.py(配置任务文件) from celery import Celery import time my_task = Celery("tasks", broker=" ...

  10. PrototypePattern(原型模式)-----Java/.Net

    原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.