Description

Input

输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目。
第2行包含N个数字,描述初始时的数列。
以下M行,每行一条命令,格式参见问题描述中的表格。
任何时刻数列中最多含有500 000个数,数列中任何一个数字均在[-1 000, 1 000]内。
插入的数字总数不超过4 000 000个,输入文件大小不超过20MBytes。

Output

对于输入数据中的GET-SUM和MAX-SUM操作,向输出文件依次打印结果,每个答案(数字)占一行。

Sample Input

  1. - - -
  2. GET-SUM
  3. MAX-SUM
  4. INSERT -
  5. DELETE
  6. MAKE-SAME
  7. REVERSE
  8. GET-SUM
  9. MAX-SUM

Sample Output

  1. -

HINT

Solution

  1. #include<cstdio>
  2. #include<iostream>
  3. #define N 500010
  4. #define inf 0x3f3f3f3f
  5. #define mid ((x>>1)+(y>>1)+(x&y&1))
  6. using namespace std;
  7. inline int Rin(){
  8. int x=,c=getchar(),f=;
  9. for(;c<||c>;c=getchar())
  10. if(!(c^))f=-;
  11. for(;c>&&c<;c=getchar())
  12. x=(x<<)+(x<<)+c-;
  13. return x*f;
  14. }
  15. struct nt{
  16. nt*ch[],*p;
  17. bool rev;int cov;
  18. int size,sum,v,lmx,rmx,mmx;
  19. bool d(){return this==p->ch[];}
  20. void setc(nt*c,int d){
  21. ch[d]=c;
  22. c->p=this;
  23. }
  24. void revIt(){
  25. rev^=;
  26. swap(lmx,rmx);
  27. swap(ch[],ch[]);
  28. }
  29. void covIt(int co){
  30. cov=v=co;
  31. sum=co*size;
  32. co>?lmx=rmx=mmx=sum:
  33. lmx=rmx=mmx=co;
  34. }
  35. void pu(){
  36. size=+ch[]->size+ch[]->size;
  37. sum=v+ch[]->sum+ch[]->sum;
  38. lmx=max(ch[]->lmx,ch[]->sum+v+max(ch[]->lmx,));
  39. rmx=max(ch[]->rmx,ch[]->sum+v+max(ch[]->rmx,));
  40. mmx=max(max(ch[]->mmx,ch[]->mmx),max(ch[]->rmx,)+v+max(ch[]->lmx,));
  41. }
  42. void relax(){
  43. if(rev)
  44. ch[]->revIt(),
  45. ch[]->revIt();
  46. if(cov^inf)
  47. ch[]->covIt(cov),
  48. ch[]->covIt(cov);
  49. rev=;
  50. cov=inf;
  51. }
  52. };
  53. nt*null=new nt();
  54. nt*root=null;
  55. int n,a[N],m;
  56. char sign[];
  57. nt*newnode(nt*p,int v){
  58. nt*o=new nt();
  59. o->size=;
  60. o->v=o->sum=o->lmx=o->rmx=o->mmx=v;
  61. o->ch[]=o->ch[]=null;
  62. o->cov=inf;
  63. o->p=p;
  64. return o;
  65. }
  66. void rot(nt*&o){
  67. nt*p=o->p;
  68. p->relax();
  69. o->relax();
  70. bool d=o->d();
  71. p->p->setc(o,p->d());
  72. p->setc(o->ch[!d],d);
  73. o->setc(p,!d);
  74. p->pu();o->pu();
  75. if(p==root)root=o;
  76. }
  77. void splay(nt*o,nt*p){
  78. while(o->p!=p)
  79. if(o->p->p==p)
  80. rot(o);
  81. else
  82. o->d()^o->p->d()?(rot(o),rot(o)):(rot(o->p),rot(o));
  83. o->pu();
  84. }
  85. nt*build(int x,int y){
  86. if(x>y)return null;
  87. nt*o=newnode(o,a[mid]);
  88. o->setc(build(x,mid-),);
  89. o->setc(build(mid+,y),);
  90. o->pu();
  91. return o;
  92. }
  93. void del(nt*&o){
  94. if(o->ch[]!=null)del(o->ch[]);
  95. if(o->ch[]!=null)del(o->ch[]);
  96. delete o;
  97. }
  98. nt*kth(int k){
  99. for(nt*o=root;;){
  100. o->relax();
  101. if(k<=o->ch[]->size)
  102. o=o->ch[];
  103. else{
  104. k-=o->ch[]->size+;
  105. if(!k)return o;
  106. o=o->ch[];
  107. }
  108. }
  109. }
  110. int main(){
  111. n=Rin(),m=Rin();
  112. for(int i=;i<=n;i++)a[i]=Rin();
  113. root=build(,n+);
  114. root->p=null;
  115. int x,y,z;
  116. while(m--){
  117. scanf("%s",sign);
  118. switch(sign[]){
  119. case'S':
  120. x=Rin(),y=Rin();
  121. for(int i=;i<=y;i++)a[i]=Rin();
  122. splay(kth(x+),null);
  123. splay(kth(x+),root);
  124. root->ch[]->setc(build(,y),);
  125. root->ch[]->pu();
  126. root->pu();
  127. break;
  128. case'L':
  129. x=Rin(),y=Rin();
  130. splay(kth(x),null);
  131. splay(kth(x+y+),root);
  132. del(root->ch[]->ch[]);
  133. root->ch[]->ch[]=null;
  134. root->ch[]->pu();
  135. root->pu();
  136. break;
  137. case'K':
  138. x=Rin(),y=Rin(),z=Rin();
  139. splay(kth(x),null);
  140. splay(kth(x+y+),root);
  141. root->ch[]->ch[]->covIt(z);
  142. root->ch[]->pu();
  143. root->pu();
  144. break;
  145. case'T':
  146. x=Rin(),y=Rin();
  147. splay(kth(x),null);
  148. splay(kth(x+y+),root);
  149. printf("%d\n",root->ch[]->ch[]->sum);
  150. break;
  151. case'V':
  152. x=Rin(),y=Rin();
  153. splay(kth(x),null);
  154. splay(kth(x+y+),root);
  155. root->ch[]->ch[]->revIt();
  156. root->ch[]->pu();
  157. root->pu();
  158. break;
  159. case'X':
  160. splay(kth(),null);
  161. splay(kth(root->size),root);
  162. printf("%d\n",root->ch[]->ch[]->mmx);
  163. break;
  164. default:break;
  165. }
  166. }
  167. return ;
  168. }

[bzoj1500][NOI2005 维修数列] (splay区间操作)的更多相关文章

  1. BZOJ1500: [NOI2005]维修数列 [splay序列操作]【学习笔记】

    以前写过这道题了,但我把以前的内容删掉了,因为现在感觉没法看 重写! 题意: 维护一个数列,支持插入一段数,删除一段数,修改一段数,翻转一段数,查询区间和,区间最大子序列 splay序列操作裸题 需要 ...

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

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

  3. BZOJ1500: [NOI2005]维修数列[splay ***]

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 12278  Solved: 3880[Submit][Statu ...

  4. bzoj1500: [NOI2005]维修数列 (Splay+变态题)

    Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 11353  Solved: 3553 [Submit][Status][Discuss] Descrip ...

  5. [bzoj1500][NOI2005]维修数列——splay

    题目 题解 这道题可以说是数列问题的大BOSS,也算是这一周来学习splay等数据结构的一个总结. 我们一个一个地看这些操作. 对于操作1,我们首先建一棵子树,直接接上原树即可. 对于操作2,我们找到 ...

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

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

  7. [BZOJ1500][NOI2005]维修数列 解题报告 Splay

    Portal Gun:[BZOJ1500][NOI2005]维修数列 有一段时间没写博客了,最近在刚数据结构......各种板子背得简直要起飞,题目也是一大堆做不完,这里就挑一道平衡树的题来写写好了 ...

  8. [BZOJ1500][NOI2005]维修数列---解题报告

    Portal Gun:[BZOJ1500][NOI2005]维修数列 有一段时间没写博客了,最近在刚数据结构......各种板子背得简直要起飞,题目也是一大堆做不完,这里就挑一道平衡树的题来写写好了 ...

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

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

随机推荐

  1. JSP-Runood:Eclipse JSP/Servlet 环境搭建

    ylbtech-JSP-Runood:Eclipse JSP/Servlet 环境搭建 1.返回顶部 1. Eclipse JSP/Servlet 环境搭建 本文假定你已安装了 JDK 环境,如未安装 ...

  2. Java中的经典算法之冒泡排序

    原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将 ...

  3. hive 内部表与外部表的区别

    hive 内部表: hive> create table soyo55(name STRING,addr STRING,money STRING) row format delimited fi ...

  4. 【Learning】多项式的一些东西

    FFT 坑 NTT 将\(FFT\)中的单位复数根改成原根即可. 卡常版NTT模版 struct Mul { int Len; int wn[N], Lim; int rev[N]; inline v ...

  5. [Swift通天遁地]一、超级工具-(17)自定义的CVCalendar日历

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  6. CSS3常用知识点

    CSS3常用知识点 1 css3选择器 1.1 属性选择器 /* E[attr~=val] 表示的一个单独的属性值 这个属性值是以空格分隔的*/ .attr2 a[class~="kawa& ...

  7. $割点割顶tarjan$

    原题 #include <bits/stdc++.h> using namespace std; typedef long long LL; inline LL read () { LL ...

  8. jQuery——表单应用(4)

    HTML: <!--复选框应用--> <!DOCTYPE html> <html> <head> <meta charset="UTF- ...

  9. 二分搜索poj106

    Cable master Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 49944   Accepted: 10493 De ...

  10. 题解报告:poj 1321 棋盘问题(dfs)

    Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子 ...