实现的功能:将序列区间反转,并维护

详见BZOJ3223

  1. var
  2. i,j,k,l,m,n,head,a1,a2:longint;
  3. s1:ansistring;
  4. a,b,c,d,fat,lef,rig:array[..] of longint;
  5. procedure swap(var x,y:longint);inline;
  6. var z:longint;
  7. begin
  8. z:=x;x:=y;y:=z;
  9. end;
  10.  
  11. procedure ext(x:longint);inline;
  12. begin
  13. if (x=) then exit;
  14. if c[x]= then exit;
  15. swap(lef[x],rig[x]);
  16. c[x]:=;
  17. c[lef[x]]:=-c[lef[x]];
  18. c[rig[x]]:=-c[rig[x]];
  19. c[]:=;
  20. end;
  21. procedure rt(x:longint);inline;
  22. var f,l:longint;
  23. begin
  24. if x= then exit;
  25. ext(x);
  26. if lef[x]= then exit;
  27. ext(lef[x]);
  28. f:=x;l:=lef[x];
  29. b[lef[x]]:=b[x];
  30. b[x]:=b[rig[x]]++b[rig[l]];
  31. lef[x]:=rig[l];
  32. fat[rig[l]]:=x;
  33. rig[l]:=x;
  34. fat[l]:=fat[x];
  35. fat[x]:=l;
  36. if rig[fat[l]]=x then rig[fat[l]]:=l;
  37. if lef[fat[l]]=x then lef[fat[l]]:=l;
  38. fat[]:=;
  39. end;
  40. procedure lt(x:longint);inline;
  41. var f,r:longint;
  42. begin
  43. if x= then exit;
  44. ext(x);if rig[x]= then exit;
  45. ext(rig[x]);
  46. f:=x;r:=rig[x];
  47. b[rig[x]]:=b[x];
  48. b[x]:=+b[lef[x]]+b[lef[r]];
  49. rig[x]:=lef[r];
  50. fat[lef[r]]:=x;
  51. lef[r]:=x;
  52. fat[r]:=fat[x];
  53. fat[x]:=r;
  54. if rig[fat[r]]=x then rig[fat[r]]:=r;
  55. if lef[fat[r]]=x then lef[fat[r]]:=r;
  56. fat[]:=;
  57. end;
  58. procedure ins(x,y:longint);inline;
  59. begin
  60. if a[y]<a[x] then
  61. begin
  62. if lef[x]= then
  63. begin
  64. lef[x]:=y;
  65. fat[y]:=x;
  66. end
  67. else ins(lef[x],y);
  68. end
  69. else
  70. begin
  71. if rig[x]= then
  72. begin
  73. rig[x]:=y;
  74. fat[y]:=x;
  75. end
  76. else ins(rig[x],y);
  77. end;
  78. b[x]:=+b[lef[x]]+b[rig[x]];
  79. end;
  80. procedure up2(var x:longint);inline;
  81. begin
  82. if (fat[x]=) or (x=) then exit;
  83. if lef[fat[x]]=x then
  84. begin
  85. if lef[fat[fat[x]]]=fat[x] then
  86. begin
  87. rt(fat[fat[x]]);
  88. rt(fat[x]);
  89. end
  90. else
  91. begin
  92. rt(fat[x]);
  93. lt(fat[x]);
  94. end;
  95. end
  96. else
  97. begin
  98. if rig[fat[fat[x]]]=fat[x] then
  99. begin
  100. lt(fat[fat[x]]);
  101. lt(fat[x]);
  102. end
  103. else
  104. begin
  105. lt(fat[x]);
  106. rt(fat[x]);
  107. end;
  108. end;
  109. end;
  110. procedure up1(x:longint);inline;
  111. begin
  112. if (x=) or (fat[x]=) then exit;
  113. if lef[fat[x]]=x then rt(fat[x]) else lt(fat[x]);
  114. end;
  115. procedure splay(x:longint);inline;
  116. begin
  117. if (x=) or (fat[x]=) then exit;
  118. while fat[fat[x]]> do
  119. up2(x);
  120. if fat[x]> then up2(x);
  121. head:=x;
  122. end;
  123. procedure splay2(x:longint);inline;
  124. begin
  125. if (x=) or (fat[x]=) then exit;
  126. while fat[fat[fat[x]]]> do
  127. up2(x);
  128. if fat[fat[x]]> then up1(x);
  129. end;
  130. function getrank(x,y:longint):longint;inline;
  131. begin
  132. if (x=) then exit();
  133. ext(x);
  134. if (b[lef[x]]+)=y then exit(x);
  135. if (b[lef[x]]+)>y then exit(getrank(lef[x],y)) else exit(getrank(rig[x],y--b[lef[x]]));
  136. end;
  137. procedure turn(x,y:longint);inline;
  138. var a1,a2:longint;
  139. begin
  140. if (x=) and (y=n) then
  141. c[head]:=-c[head]
  142. else
  143. begin
  144. if (x=) then
  145. begin
  146. a1:=getrank(head,y+);
  147. splay(a1);
  148. ext(a1);
  149. c[lef[a1]]:=-c[lef[a1]];
  150. end
  151. else
  152. begin
  153. if (y=n) then
  154. begin
  155. a2:=getrank(head,x-);
  156. splay(a2);
  157. ext(a2);
  158. c[rig[a2]]:=-c[rig[a2]];
  159. end
  160. else
  161. begin
  162. a1:=getrank(head,x-);
  163. a2:=getrank(head,y+);
  164. splay(a2);splay2(a1);
  165. ext(a2);ext(a1);
  166. c[rig[a1]]:=-c[rig[a1]];
  167. end;
  168. end;
  169. end;
  170. end;
  171. function showoff(x:longint):ansistring;inline;
  172. var s1:ansistring;
  173. begin
  174. if x= then exit('');
  175. ext(x);
  176. str(x,s1);
  177. exit(showoff(lef[x])+s1+' '+showoff(rig[x]));
  178. end;
  179. begin
  180. readln(n,m);
  181. for i:= to n do
  182. begin
  183. a[i]:=i;c[i]:=;b[i]:=;
  184. end;
  185. head:=;
  186. for i:= to n do
  187. begin
  188. ins(head,i);
  189. splay(random(i)+);
  190. end;
  191. for i:= to m do
  192. begin
  193. readln(a1,a2);
  194. turn(a1,a2);
  195. end;
  196. s1:=showoff(head);
  197. writeln(s1);
  198. readln;
  199. end.

算法模板——splay区间反转 1的更多相关文章

  1. 算法模板——splay区间反转 2

    实现功能:同splay区间反转 1(基于BZOJ3223 文艺平衡树) 这次改用了一个全新的模板(HansBug:琢磨了我大半天啊有木有),大大简化了程序,同时对于splay的功能也有所完善 这里面没 ...

  2. Splay 区间反转

    同样的,我们以一道题来引入. 传送门 这次的任务比较少,只要求进行区间反转.区间反转? 这个好像用啥都是O(n)的吧……(这次vector,set也救不了你了) 我们来使用splay解决这个问题.我们 ...

  3. hdu 1890 Robotic Sort(splay 区间反转+删点)

    题目链接:hdu 1890 Robotic Sort 题意: 给你n个数,每次找到第i小的数的位置,然后输出这个位置,然后将这个位置前面的数翻转一下,然后删除这个数,这样执行n次. 题解: 典型的sp ...

  4. [bzoj3223]文艺平衡树(splay区间反转模板)

    解题关键:splay模板题. #include<cstdio> #include<cstring> #include<algorithm> #include< ...

  5. HDU 1890 - Robotic Sort - [splay][区间反转+删除根节点]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1890 Time Limit: 6000/2000 MS (Java/Others) Memory Li ...

  6. HDU3487 Play with Chain splay 区间反转

    HDU3487 splay最核心的功能是将平衡树中的节点旋转到他的某个祖先的位置,并且维持平衡树的性质不变. 两个操作(数组实现) cut l,r, c把[l,r]剪下来放到剩下序列中第c个后面的位置 ...

  7. 2018牛客网暑期ACM多校训练营(第三场) H - Shuffle Cards - [splay伸展树][区间移动][区间反转]

    题目链接:https://www.nowcoder.com/acm/contest/141/C 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...

  8. 算法笔记--Splay && Link-Cut-Tree

    Splay 参考:https://tiger0132.blog.luogu.org/slay-notes 普通模板: ; ], val[N], cnt[N], fa[N], sz[N], lazy[N ...

  9. hdu1890 伸展树(区间反转)

    对于大神来说这题是水题.我搞这题花了快2天. 伸展树的优点有什么,就是树不管你怎么旋转序列是不会改变得,并且你要使区间反转,只要把第k大的点转到根结点,那么它的左子树就是要交换的区间[l,r),然后交 ...

随机推荐

  1. storm遇到问题汇总

    http://www.reader8.cn/jiaocheng/20131023/2139887.html 错误1:在windows下运行ExclamationTopology或者WordCountT ...

  2. python中关于字符串的操作

    Python 字符串操作方法大全 python字符串操作实方法大合集,包括了几乎所有常用的python字符串操作,如字符串的替换.删除.截取.复制.连接.比较.查找.分割等,需要的朋友可以参考下 1. ...

  3. CodeForces462B

    Appleman and Card Game Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & % ...

  4. 用Spark学习矩阵分解推荐算法

    在矩阵分解在协同过滤推荐算法中的应用中,我们对矩阵分解在推荐算法中的应用原理做了总结,这里我们就从实践的角度来用Spark学习矩阵分解推荐算法. 1. Spark推荐算法概述 在Spark MLlib ...

  5. 真分布式SolrCloud+Zookeeper+tomcat搭建、索引Mysql数据库、IK中文分词器配置以及web项目中solr的应用(1)

    版权声明:本文为博主原创文章,转载请注明本文地址.http://www.cnblogs.com/o0Iris0o/p/5813856.html 内容介绍: 真分布式SolrCloud+Zookeepe ...

  6. 史上最牛逼的文件bom头清除代码,万能检测清除php,js等等

    做php开发,经常部分uft8的php文件因BOM头不同导致各种错误和错位.网上搜到的大部分所谓的去处bom工具都是2货,没有能用的.下面的一段代码,请复制到一个php文件里,然后上传到你的网站根目录 ...

  7. iOS开发一些小技巧

    1.隐藏多余的tableView的cell分割线 self.tableView.tableFooterView= [[UIViewalloc]init]; 2.取消系统自带的返回字样 [[UIBarB ...

  8. CTR预估中的贝叶斯平滑方法及其代码实现

    1. 背景介绍 广告形式: 互联网广告可以分为以下三种: 1)展示广告(display ad) 2)搜索广告(sponsored search ad) 3)上下文广告(contextual ad)   ...

  9. python报错UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 0 解决方案

    环境:mac+python 2.7 场景描述:在使用python修改excel内容修改表格内容为中文保存时报以下错误 此时已经设置了utf-8了 但保存时仍然报错错 此时将python中的中文使用un ...

  10. Azure 基础:使用 powershell 创建虚拟网络

    什么是虚拟网络 虚拟网络是您的网络在 Azure 云上的表示形式.您可以完全控制虚拟网络的 IP 地址.DNS 的设置.安全策略和路由表.您还可以更进一步,把虚拟网络划分为多个子网.然后用它们连接您的 ...