BZOJ_1895_Pku3580 supermemo_Splay

Description

给出一个初始序列fA1;A2;:::Ang,要求你编写程序支持如下操作: 1. ADDxyD:给子序列fAx:::Ayg的每个元素都加上D。例如对f1,2, 3,4,5g执行"ADD 241" 会得到f1,3,4,5,5g。 2. REVERSExy:将子序列fAx:::Ayg翻转。例如对f1,2,3,4,5g执 行"REVERSE 24"会得到f1,4,3,2,5g。 3. REVOLVExyT:将子序列fAx:::Ayg旋转T个单位。例如, 对f1,2,3,4,5g执行"REVOLVE 242"会得到f1,3,4,2,5g。 4. INSERTxP:在Ax后插入P。例如,对f1,2,3,4,5g执行"INSERT 24"会得到f1,2,4,3,4,5g。 5. DELETEx:删去Ax。例如,对f1,2,3,4,5g执行"DELETE 2"会得 到f1,3,4,5g。 6. MINxy:查询子序列fAx:::Ayg中的最小元素。例如,对于序列f1, 2,3,4,5g,询问"MIN 24"的返回应为2。

Input

第一行包含一个整数n,表示初始序列的长度。 以下n行每行包含一个整数,描述初始的序列。 接下来一行包含一个整数m,表示操作的数目。 以下m行每行描述一个操作。

Output

对于所有"MIN"操作,输出正确的答案,每行一个。

Sample Input

5
1
2
3
4
5
2
ADD 2 4 1
MIN 4 5

Sample Output

5

HINT

输入、输出以及中间运算结果均不会超过32位整数。
对于30%的数据,n;m 6 1000;
对于100%的数据,n;m 6 100000。


splay裸题,操作稍微多了点。

旋转操作可以理解为进行三次区间翻转操作,这样就十分方便了。

注意旋转单位要mod区间长度。

具体实现在代码中:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <algorithm>
  4. using namespace std;
  5. #define N 1200050
  6. #define ls ch[p][0]
  7. #define rs ch[p][1]
  8. #define get(x) (ch[f[x]][1]==x)
  9. int ch[N][2],f[N],siz[N],turn[N],val[N],mn[N],rt;
  10. int a[N],n,add[N],sz,m,now;
  11. char opt[10];
  12. void pushup(int p){
  13. if(!p)return ;
  14. siz[p]=1;
  15. if(ls) siz[p]+=siz[ls];
  16. if(rs) siz[p]+=siz[rs];
  17. mn[p]=min(mn[ls],mn[rs]);
  18. mn[p]=min(mn[p],val[p]);
  19. }
  20. void pushdown(int p)
  21. {
  22. if(add[p]){
  23. if(ls) mn[ls]+=add[p],val[ls]+=add[p],add[ls]+=add[p];
  24. if(rs) mn[rs]+=add[p],val[rs]+=add[p],add[rs]+=add[p];
  25. add[p]=0;
  26. }
  27. if(turn[p]){
  28. swap(ls,rs);
  29. if(ls) turn[ls]^=1;
  30. if(rs) turn[rs]^=1;
  31. turn[p]=0;
  32. }
  33. }
  34. void rotate(int x)
  35. {
  36. int y=f[x],z=f[y],k=get(x);
  37. ch[y][k]=ch[x][!k];f[ch[y][k]]=y;
  38. ch[x][!k]=y;f[y]=x;f[x]=z;
  39. if(z) ch[z][ch[z][1]==y]=x;
  40. pushup(y);pushup(x);
  41. if(rt==y) rt=x;
  42. }
  43. void splay(int x,int y)
  44. {
  45. for(int fa;(fa=f[x])!=y;rotate(x))
  46. if(f[fa]!=y)
  47. rotate((get(x)==get(fa)) ? fa : x);
  48. }
  49. int find(int x)
  50. {
  51. int p=rt;
  52. while(1)
  53. {
  54. pushdown(p);
  55. if(x<=siz[ls]) p=ls;
  56. else{
  57. x-=siz[ls]+1;
  58. if(!x) return p;
  59. p=rs;
  60. }
  61. }
  62. }
  63. void addadd(int x,int p,int v)
  64. {
  65. x=find(x);
  66. p=find(p);
  67. splay(x,0);
  68. splay(p,rt);
  69. add[ls]+=v;
  70. mn[ls]+=v;
  71. val[ls]+=v;
  72. pushup(p);pushup(x);
  73. }
  74. void reverse(int x,int p)
  75. {
  76. x=find(x);
  77. p=find(p);
  78. splay(x,0);
  79. splay(p,rt);
  80. turn[ls]^=1;
  81. }
  82. void build(int fa,int l,int r)
  83. {
  84. if(l>r) return ;
  85. int mid=l+r>>1;
  86. ch[fa][mid>fa]=mid;
  87. f[mid]=fa;
  88. val[mid]=mn[mid]=a[mid-1];
  89. build(mid,l,mid-1);
  90. build(mid,mid+1,r);
  91. pushup(mid);
  92. }
  93. void insert(int x,int v)
  94. {
  95. now++;
  96. int p=x+1;
  97. x=find(x);
  98. p=find(p);
  99. splay(x,0);
  100. splay(p,rt);
  101. ls=++sz;
  102. val[ls]=mn[ls]=v;
  103. f[ls]=p;
  104. siz[ls]=1;
  105. pushup(p);pushup(x);
  106. }
  107. void del(int x)
  108. {
  109. now--;
  110. int p=x+2;
  111. x=find(x);
  112. p=find(p);
  113. splay(x,0);
  114. splay(p,rt);
  115. ls=0;
  116. pushup(p);pushup(x);
  117. }
  118. int ask(int x,int p)
  119. {
  120. x=find(x);
  121. p=find(p);
  122. splay(x,0);
  123. splay(p,rt);
  124. return mn[ls];
  125. }
  126. /*void print()
  127. {
  128. int p,i;
  129. for(i=1;i<=now;i++){
  130. p=find(i);
  131. printf("p=%d val[p]=%d\n",p,val[p]);
  132. }
  133. }*/
  134. int main(){
  135. //memset(mn,0x3f,sizeof(mn));
  136. mn[0]=1<<30;
  137. scanf("%d",&n);
  138. int i,x,y,z;
  139. for(i=1;i<=n;i++) scanf("%d",&a[i]);
  140. build(0,1,n+2);
  141. sz=now=n+2;
  142. rt=n+3>>1;
  143. scanf("%d",&m);
  144. for(i=1;i<=m;i++)
  145. {
  146. scanf("%s%d",opt,&x);
  147. if(opt[0]=='A')
  148. {
  149. scanf("%d%d",&y,&z);
  150. x++;y++;
  151. addadd(x-1,y+1,z);
  152. }
  153. else if(opt[0]=='R')
  154. {
  155. scanf("%d",&y);
  156. x++;y++;
  157. if(opt[3]=='E')
  158. {
  159. reverse(x-1,y+1);
  160. }
  161. else
  162. {
  163. scanf("%d",&z);
  164. z%=(y-x+1);
  165. if(z==0)continue;
  166. reverse(x-1,y+1);
  167. reverse(x-1,x+z);
  168. reverse(x+z-1,y+1);
  169. }
  170. }
  171. else if(opt[0]=='I')
  172. {
  173. scanf("%d",&y);
  174. x++;
  175. insert(x,y);
  176. }
  177. else if(opt[0]=='D')
  178. {
  179. x++;
  180. del(x-1);
  181. }
  182. else {
  183. scanf("%d",&y);
  184. x++;y++;
  185. printf("%d\n",ask(x-1,y+1));
  186. }
  187. }
  188. }

BZOJ_1895_Pku3580 supermemo_Splay的更多相关文章

随机推荐

  1. GitHub Desktop 如何创建本地仓库,上传代码,删除仓库

    1.创建本地仓库 2.打开本地仓库,将要上传的文件放到本地仓库. 3.ctrl+p push仓库或者菜单栏Repository下push也可以用右上角的publish respository 4.左边 ...

  2. rsync+innotify做到同步式更新

    innotify主要功能: 他是内核用于通知用户控件程序文件系统变化的机制. 也就是说,当服务器发生了任何的改动,内核都会知道并通知用户. rssync(做同步的)+innotify做到的就是实时的同 ...

  3. Pyharm中关于“warning: Debugger speedups using cython not found”问题的解决

    在终端中输入 Python "/Applications/PyCharm CE.app/Contents/helpers/pydev/setup_cython.py" build_ ...

  4. Drupal7.8的安装注意的问题

    首先推荐在安装之前,首先阅读一下官方的Installation guide ,说实话话,这玩意安装没有Joomla安装那么平滑,大多数问题,guide都会提到.我是先安装后看的这个guide,比较折腾 ...

  5. Bootstrap 4,“未捕获错误:Bootstrap工具提示需要Tether(http://github.hubspot.com/tether/)”

    如果出现了这个错误,我想你是没有引用tether文件,这在v4之前不需要单独引入的. https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/te ...

  6. eBay账号token授权

    1.注册开发者账号(https://go.developer.ebay.com/) hufangyong   hu6253859. 2.注册沙箱测试账号(http://sandbox.ebay.com ...

  7. Java虚拟机-内存tips

    java虚拟机内存可以分为独占区和共享区. 独占区:虚拟内存栈.本地方法栈.程序计数器. 共享区:方法区.Java堆(用来存放对象实例). 程序计数器 比较小的内存空间,当前线程所执行的字节码的行号指 ...

  8. JS中的top是什么?

    <iframe/>或者<frame>里面用主页面的东西,就是top.xxx如:<script> function func(){ ... };</script ...

  9. Bootstrap在线引用css和js

    百度在线调用 <script src="http://libs.baidu.com/bootstrap/3.0.3/js/bootstrap.min.js"></ ...

  10. flash builder 4.6与myecilpse 10.7集成

    一.在flash builder 4.0以后就没有单独提供插件版的flash builder了,因此必须先安装完整版的flash builder,再进行插件集成. 二.集成过程比较简单但也有几个要注意 ...