传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3224

保存splay模版

一刻不停写了一个小时多一点,幸好一遍过了!(其实带着freopen wa了一次)

添加一个易出bug的地方叭(鉴于曾经有次这么错过):此题平衡树里可以用重复值,我是用tm保存出现的次数,因此在求第k大时,千万小心循环结束条件!

  1. #include <cstdio>
  2. #include <algorithm>
  3.  
  4. const int maxn = 200005;
  5.  
  6. int fa[maxn], ch[maxn][2], key[maxn], tm[maxn], siz[maxn], root, cnt, t1, t2;
  7.  
  8. inline void pushup(int x) {
  9. siz[x] = siz[ch[x][0]] + siz[ch[x][1]] + tm[x];
  10. }
  11. inline void rotate(int x) {
  12. int y = fa[x];
  13. if (y == ch[fa[y]][0]) {
  14. ch[fa[y]][0] = x;
  15. }
  16. else {
  17. ch[fa[y]][1] = x;
  18. }
  19. fa[x] = fa[y];
  20. int dir = x == ch[y][1];
  21. ch[y][dir] = ch[x][dir ^ 1];
  22. fa[ch[x][dir ^ 1]] = y;
  23. ch[x][dir ^ 1] = y;
  24. fa[y] = x;
  25. pushup(y);
  26. pushup(x);
  27. }
  28. inline void splay(int x) {
  29. int p, flag1, flag2;
  30. while (fa[x]) {
  31. p = fa[x];
  32. if (!fa[p]) {
  33. rotate(x);
  34. }
  35. else {
  36. flag1 = x == ch[p][1];
  37. flag2 = p == ch[fa[p]][1];
  38. if (flag1 ^ flag2) {
  39. rotate(x);
  40. }
  41. else {
  42. rotate(p);
  43. }
  44. rotate(x);
  45. }
  46. }
  47. root = x;
  48. }
  49. bool ist(int x, int val, int p, int dir) {
  50. if (!x) {
  51. key[++cnt] = val;
  52. tm[cnt] = 1;
  53. siz[cnt] = 1;
  54. fa[cnt] = p;
  55. ch[p][dir] = cnt;
  56. return true;
  57. }
  58. if (val < key[x]) {
  59. bool rt = ist(ch[x][0], val, x, 0);
  60. pushup(x);
  61. return rt;
  62. }
  63. else if (val > key[x]) {
  64. bool rt = ist(ch[x][1], val, x, 1);
  65. pushup(x);
  66. return rt;
  67. }
  68. else {
  69. ++tm[x];
  70. ++siz[x];
  71. return false;
  72. }
  73. }
  74. inline int fndmin(int x) {
  75. int rt = x, mn = key[x];
  76. for (int i = ch[x][0]; i; i = ch[i][0]) {
  77. if (mn > key[i]) {
  78. mn = key[rt = i];
  79. }
  80. }
  81. return rt;
  82. }
  83. inline int fndmax(int x) {
  84. int rt = x, mx = key[x];
  85. for (int i = ch[x][1]; i; i = ch[i][1]) {
  86. if (mx < key[i]) {
  87. mx = key[rt = i];
  88. }
  89. }
  90. return rt;
  91. }
  92. void del(int x, int value) {
  93. if (!x) {
  94. return;
  95. }
  96. if (value < key[x]) {
  97. del(ch[x][0], value);
  98. pushup(x);
  99. }
  100. else if (value > key[x]) {
  101. del(ch[x][1], value);
  102. pushup(x);
  103. }
  104. else if (tm[x] > 1) {
  105. --tm[x];
  106. --siz[x];
  107. }
  108. else {
  109. splay(x);
  110. fa[ch[x][0]] = fa[ch[x][1]] = 0;
  111. if (!ch[x][0]) {
  112. root = ch[x][1];
  113. }
  114. else if (!ch[x][1]) {
  115. root = ch[x][0];
  116. }
  117. else {
  118. root = fndmax(ch[x][0]);
  119. splay(root);
  120. fa[ch[x][1]] = root;
  121. ch[root][1] = ch[x][1];
  122. pushup(root);
  123. }
  124. }
  125. }
  126. inline int qianqu(int val) {
  127. if (ist(root, val, 0, 0)) {
  128. splay(cnt);
  129. }
  130. int x = root;
  131. while (val != key[x]) {
  132. x = ch[x][val > key[x]];
  133. }
  134. splay(x);
  135. x = key[fndmax(ch[x][0])];
  136. del(root, val);
  137. return x;
  138. }
  139. inline int houji(int val) {
  140. if (ist(root, val, 0, 0)) {
  141. splay(cnt);
  142. }
  143. int x = root;
  144. while (val != key[x]) {
  145. x = ch[x][val > key[x]];
  146. }
  147. splay(x);
  148. x = key[fndmin(ch[x][1])];
  149. del(root, val);
  150. return x;
  151. }
  152. inline int getrank(int val) {
  153. int x = root;
  154. while (key[x] != val) {
  155. x = ch[x][val > key[x]];
  156. }
  157. splay(x);
  158. return siz[ch[x][0]] + 1;
  159. }
  160. inline int getnum(int rank) {
  161. int x = root;
  162. while (rank <= siz[ch[x][0]] || rank > siz[ch[x][0]] + tm[x]) {
  163. if (rank <= siz[ch[x][0]]) {
  164. x = ch[x][0];
  165. }
  166. else {
  167. rank -= siz[ch[x][0]] + tm[x];
  168. x = ch[x][1];
  169. }
  170. }
  171. return key[x];
  172. }
  173.  
  174. int main(void) {
  175. int n;
  176. scanf("%d", &n);
  177. while (n--) {
  178. scanf("%d%d", &t1, &t2);
  179. if (t1 == 1) {
  180. if (ist(root, t2, 0, 0)) {
  181. splay(cnt);
  182. }
  183. }
  184. else if (t1 == 2) {
  185. del(root, t2);
  186. }
  187. else if (t1 == 3) {
  188. printf("%d\n", getrank(t2));
  189. }
  190. else if (t1 == 4) {
  191. printf("%d\n", getnum(t2));
  192. }
  193. else if (t1 == 5) {
  194. printf("%d\n", qianqu(t2));
  195. }
  196. else {
  197. printf("%d\n", houji(t2));
  198. }
  199. }
  200. return 0;
  201. }

  

_bzoj3224 Tyvj 1728 普通平衡树【Splay】的更多相关文章

  1. bzoj3224: Tyvj 1728 普通平衡树(splay)

    3224: Tyvj 1728 普通平衡树 题目:传送门 题解: 啦啦啦啦又来敲个模版水经验啦~ 代码: #include<cstdio> #include<cstring> ...

  2. 【BZOJ3224】Tyvj 1728 普通平衡树 Splay

    Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...

  3. BZOJ3224 洛谷3369 Tyvj 1728 普通平衡树 splay

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3224 题意概括 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. ...

  4. bzoj 3224/Tyvj 1728 普通平衡树(splay)

    Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...

  5. BZOJ 3224 Tyvj 1728 普通平衡树 | Splay 板子+SPlay详细讲解

    下面给出Splay的实现方法(复杂度证明什么的知道是 nlogn 就可以啦) 首先对于一颗可爱的二叉查找树,是不能保证最坏nlogn的复杂度(可以想象把一个升序序列插入) (二叉查找树保证左子树元素大 ...

  6. [bzoj3224]Tyvj 1728 普通平衡树——splay模板

    题目 你需要写一种数据结构支援以下操作. 插入元素. 删除元素. 查询元素的排名. 查询第k小的元素. 查询元素前趋. 查询元素后继. 题解 BBST裸题. 代码 #include <cstdi ...

  7. BZOJ 3224: Tyvj 1728 普通平衡树 or 洛谷 P3369 【模板】普通平衡树-Splay树模板题

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 22483  Solved: 10130[Submit][S ...

  8. BZOJ_3224 Tyvj 1728 普通平衡树 【离散化+权值线段树】

    一 题面 Tyvj 1728 普通平衡树 二 分析 比较明显是可以用平衡二叉搜索树(splay)做的. 用权值线段树做,前提就是要先离散化,因为权值线段树维护的值域信息. 板子. 三 AC代码 #in ...

  9. 3224: Tyvj 1728 普通平衡树(新板子)

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 17048  Solved: 7429[Submit][St ...

随机推荐

  1. linux定时重启节约内存

    linux服务器上运行的一些程序,比较消耗内存,需要定时重启,进行内存定期释放 0 2 * * *  sudo /sbin/reboot && echo $(date) '重启成功' ...

  2. Ansible 详细用法说明(一)

    一.概述 运维工具按需不需要有代理程序来划分的话分两类: agent(需要有代理工具):基于专用的agent程序完成管理功能,puppet, func, zabbix agentless(无须代理工具 ...

  3. 配置activeMQ

    一.加入以下的库 并配置好路径 ws2_32.lib;Mswsock.lib;cppunit.lib;libapr-1.lib;libapriconv-1.lib;libaprutil-1.lib;l ...

  4. Android耳机线控具体解释,蓝牙耳机button监听(仿酷狗线控效果)

    转载请注明出处:http://blog.csdn.net/fengyuzhengfan/article/details/46461253 当耳机的媒体按键被单击后.Android系统会发出一个广播.该 ...

  5. shuf乱序排列

    如何从文件中随即选取1000行内容呢?我们可以使用shuf命令 shuf [ 其中,shuf会读取file中的内容,并生成乱序的排列,进而使用head命令,取出前1000行

  6. mac 使用命令行,对远程服务器进行文件更新

    目的:更新服务器文件A 1.远程传输文件 A.zip 在本地A文件的父级文件夹下执行 scp ./A.zip 远程服务器用户名@远程服务器IP:/要放置的文件夹目录/ 然后要输入服务器登陆密码,进行文 ...

  7. Elasticsearch - 搜索类型与搜索位置

    一.搜索类型: Elasticsearch同意用户选择其所希望的处理查询的方式. 由于存在一些不同的情形,对其使用不同的搜索类型才是合适的.为了控制查询的运行方式,我们能够在请求中使用search_t ...

  8. autofac如何注册静态方法里的接口对象

    标题可能是不准确的,因为我不知道如何描述.不知道的原因,是对依赖注入一知半解. Autofac可以自动注册对象实例到接口,人所尽知.而在asp.net mvc中,这个实例化的工作,通常在每个控制器的构 ...

  9. 自己写的Android端HttpUtil工具类

    package com.sxt.jcjd.util; import java.io.IOException; import java.io.UnsupportedEncodingException; ...

  10. Koa2学习(六)使用koa-router

    Koa2学习(六)使用koa-router 配置简单路由 引入中间件 配置需要的路由 通过app.use注册路由 const Koa = require('koa') const app = new ...