找到一份比较好的板子,链接https://blog.csdn.net/crazy_ac/article/details/8034190

  1. #include<cstdio>
  2. #include<cstdlib>
  3. const int inf = ~0u>>;
  4. #define L ch[x][0]
  5. #define R ch[x][1]
  6. #define KT (ch[ ch[rt][1] ][0])
  7. const int maxn = ;
  8. int lim;
  9. struct SplayTree {
  10. int sz[maxn];
  11. int ch[maxn][];
  12. int pre[maxn];
  13. int rt,top;
  14. inline void up(int x){
  15. sz[x] = cnt[x] + sz[ L ] + sz[ R ];
  16. }
  17. inline void Rotate(int x,int f){
  18. int y=pre[x];
  19. ch[y][!f] = ch[x][f];
  20. pre[ ch[x][f] ] = y;
  21. pre[x] = pre[y];
  22. if(pre[x]) ch[ pre[y] ][ ch[pre[y]][] == y ] =x;
  23. ch[x][f] = y;
  24. pre[y] = x;
  25. up(y);
  26. }
  27. inline void Splay(int x,int goal){//将x旋转到goal的下面
  28. while(pre[x] != goal){
  29. if(pre[pre[x]] == goal) Rotate(x , ch[pre[x]][] == x);
  30. else {
  31. int y=pre[x],z=pre[y];
  32. int f = (ch[z][]==y);
  33. if(ch[y][f] == x) Rotate(x,!f),Rotate(x,f);
  34. else Rotate(y,f),Rotate(x,f);
  35. }
  36. }
  37. up(x);
  38. if(goal==) rt=x;
  39. }
  40. inline void RTO(int k,int goal){//将第k位数旋转到goal的下面
  41. int x=rt;
  42. while(sz[ L ] != k-) {
  43. if(k < sz[ L ]+) x=L;
  44. else {
  45. k-=(sz[ L ]+);
  46. x = R;
  47. }
  48. }
  49. Splay(x,goal);
  50. }
  51. inline void vist(int x){
  52. if(x){
  53. printf("结点%2d : 左儿子 %2d 右儿子 %2d val:%2d sz=%d cnt:%d\n",x,L,R,val[x],sz[x],cnt[x]);
  54. vist(L);
  55. vist(R);
  56. }
  57. }
  58. void debug() {
  59. puts("");
  60. vist(rt);
  61. puts("");
  62. }
  63. inline void Newnode(int &x,int c,int f){
  64. x=++top;
  65. L = R = ;
  66. pre[x] = f;
  67. sz[x]=; cnt[x]=;
  68. val[x] = c;
  69. }
  70. inline void init(){
  71. ch[][]=ch[][]=pre[]=sz[]=;
  72. rt=top=; cnt[]=;
  73. }
  74. inline void Insert(int &x,int key,int f){
  75. if(!x) {
  76. Newnode(x,key,f);
  77. Splay(x,);//注意插入完成后splay
  78. return ;
  79. }
  80. if(key==val[x]){
  81. cnt[x]++;
  82. sz[x]++;
  83. Splay(x,);//注意插入完成后splay
  84. return ;
  85. }else if(key<val[x]) {
  86. Insert(L,key,x);
  87. } else {
  88. Insert(R,key,x);
  89. }
  90. up(x);
  91. }
  92. void Del_root(){//删除根节点
  93. int t=rt;
  94. if(ch[rt][]) {
  95. rt=ch[rt][];
  96. RTO(,);
  97. ch[rt][]=ch[t][];
  98. if(ch[rt][]) pre[ch[rt][]]=rt;
  99. }
  100. else rt=ch[rt][];
  101. pre[rt]=;
  102. up(rt);
  103. }
  104. void findpre(int x,int key,int &ans){//找前驱节点
  105. if(!x) return ;
  106. if(val[x] <= key){
  107. ans=x;
  108. findpre(R,key,ans);
  109. } else
  110. findpre(L,key,ans);
  111. }
  112. void findsucc(int x,int key,int &ans){//找后继节点
  113. if(!x) return ;
  114. if(val[x]>=key) {
  115. ans=x;
  116. findsucc(L,key,ans);
  117. } else
  118. findsucc(R,key,ans);
  119. }
  120. inline int find_kth(int x,int k){ //第k小的数
  121. if(k<sz[L]+) {
  122. return find_kth(L,k);
  123. }else if(k > sz[ L ] + cnt[x] )
  124. return find_kth(R,k-sz[L]-cnt[x]);
  125. else{
  126. Splay(x,);
  127. return val[x];
  128. }
  129. }
  130. int find(int x,int key){
  131. if(!x) return ;
  132. else if(key < val[x]) return find(L,key);
  133. else if(key > val[x]) return find(R,key);
  134. else return x;
  135. }
  136. int getmin(int x){
  137. while(L) x=L; return val[x];
  138. }
  139. int getmax(int x){
  140. while(R) x=R; return val[x];
  141. }
  142. //确定key的排名
  143. int getrank(int x,int key,int cur){//cur:当前已知比要求元素(key)小的数的个数
  144. if(key == val[x])
  145. return sz[L] + cur + ;
  146. else if(key < val[x])
  147. getrank(L,key,cur);
  148. else
  149. getrank(R,key,cur+sz[L]+cnt[rt]);
  150. }
  151. int get_lt(int x,int key){//小于key的数的个数 lt:less than
  152. if(!x) return ;
  153. if(val[x]>=key) return get_lt(L,key);
  154. return cnt[x]+sz[L]+get_lt(R,key);
  155. }
  156. int get_mt(int x,int key){//大于key的数的个数 mt:more than
  157. if(!x) return ;
  158. if(val[x]<=key) return get_mt(R,key) ;
  159. return cnt[x]+sz[R]+get_mt(L,key);
  160. }
  161. void del(int &x,int f){//删除小于lim的所有的数所在的节点
  162. if(!x) return ;
  163. if(val[x]>=lim){
  164. del(L,x);
  165. } else {
  166. x=R;
  167. pre[x]=f;
  168. if(f==) rt=x;
  169. del(x,f);
  170. }
  171. if(x) up(x);
  172. }
  173. inline void update(){
  174. del(rt,);
  175. }
  176. int get_mt(int key) {
  177. return get_mt(rt,key);
  178. }
  179. int get_lt(int key) {
  180. return get_lt(rt,key);
  181. }
  182. void insert(int key) {
  183. Insert(rt,key,);
  184. }
  185. void Delete(int key) {
  186. int node=find(rt,key);
  187. Splay(node,);
  188. cnt[rt]--;
  189. if(!cnt[rt])Del_root();
  190. }
  191. int kth(int k) {
  192. return find_kth(rt,k);
  193. }
  194. int cnt[maxn];
  195. int val[maxn];
  196. int lim;
  197. }spt;

splay好板子的更多相关文章

  1. 个人整理的数组splay板子,指针的写的太丑了就不放了。。

    splay的板子.. 由于被LCT榨干了..所以昨天去学了数组版的splay,现在整理一下板子.. 以BZOJ3224和3223为例题..暂时只有这些,序列的话等有时间把维修序列给弄上来!! BZOJ ...

  2. 在平衡树的海洋中畅游(三)——Splay

    Preface 由于我怕学习了Splay之后不直接写blog第二天就忘了,所以强行加了一波优先级. 论谁是天下最秀平衡树,我Splay第一个不服.维护平衡只靠旋转. 一言不合转死你 由于平衡树我也介绍 ...

  3. 洛谷P3369 【模板】普通平衡树(Splay)

    题面 传送门 题解 鉴于最近的码力实在是弱到了一个境界--回来重新打一下Splay的板子--竟然整整调了一个上午-- //minamoto #include<bits/stdc++.h> ...

  4. 浅谈算法——splay

    BST(二叉查找树)是个有意思的东西,种类巨TM多,然后我们今天不讲其他的,我们今天就讲splay 首先,如果你不知道Splay是啥,你也得知道BST是啥 如上图就是一棵优美的BST,它对于每个点保证 ...

  5. 写在SDOI2016Round1前的To Do List

    理性的整理了一下自己的不足. 计算几何啥都不会,字符串类DP毫无练习,数据结构写的不熟,数论推不出式子,网络流建模常建残: 需要达成的任务: 一.网络流: 熟练网络流的板子(之前一直仰慕zkw费用流, ...

  6. 枪战Maf[POI2008]

    题目描述 有n个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪.因此,对于不同的开枪顺序,最后死的人也不同. 输入 输入n人 ...

  7. 洛谷P3369 普通平衡树

    刚学平衡树,分别用了Splay和fhq-treap交了一遍. 这是Splay的板子,貌似比较短? Splay #include <iostream> #include <cstdio ...

  8. Link Cut Tree学习笔记

    从这里开始 动态树问题和Link Cut Tree 一些定义 access操作 换根操作 link和cut操作 时间复杂度证明 Link Cut Tree维护链上信息 Link Cut Tree维护子 ...

  9. Luogu1801_黑匣子_KEY

    题目传送门 借这道题练一下Treap和Splay的板子. code: #include <cstdio> #include <cstdlib> using namespace ...

随机推荐

  1. 使用sklearn进行数据挖掘

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  2. 金融量化分析【day113】:PGEC策略

    一.PGE简介 二.PGE代码 # 导入函数库 import jqdata import pandas as pd def initialize(context): set_benchmark('00 ...

  3. 设计模式---单一职责模式之装饰模式(Decorator)

    前提:"单一职责"模式 在软件组件的设计中,如果责任划分的不清晰,使用继承,得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任 典型模式(表现 ...

  4. GUI之ScrollView的使用

    ScrollView ScrollView是unity提供的一个方便的滚动视图. 组成 ScrollView由四个部分组成: ViewPort 和 Content ScrollView: 视图范围,C ...

  5. Docker 入门 第五部分:Stacks

    目录 Docker 入门 第五部分:Stacks 先决条件 介绍 添加一个新的服务并重新部署 保存数据 回顾 Docker 入门 第五部分:Stacks 先决条件 安装 Docker 1.13 或更高 ...

  6. 第3月第1天 GCDAsyncSocket dispatch_source_set_event_handler runloop

    + (void)startCFStreamThreadIfNeeded { LogTrace(); static dispatch_once_t predicate; dispatch_once(&a ...

  7. $PollardRho$ 算法及其优化详解

    \(PollardRho\) 算法总结: Pollard Rho是一个非常玄学的算法,用于在\(O(n^{1/4})\)的期望时间复杂度内计算合数n的某个非平凡因子(除了1和它本身以外能整除它的数). ...

  8. mysql 案例 ~ pt-io工具的使用

    一 简介:如何使用pt-iopfile调查io具体信息二 目的:利用pt-iopfile分析mysql内部IO操作密集的文件,用以发现问题三 使用: pt-iopfile -p mysql_pid   ...

  9. JQuery中的$.getScript()、$.getJson()和$.ajax()方法

    $.getScript() 有时候,在页面初次加载时就取得所需的全部JavaScript文件是完全没有必要的.虽然可以在需要哪个JavaScript文件时,动态地创建<script>标签, ...

  10. Three.js基础探寻二——正交投影照相机

    本篇主要介绍照相机中的正交投影照相机. 第一篇传送门:Three.js基础探寻一 1.照相机 图形学中的照相机定义了三维空间到二维屏幕的投影方式. 针对投影方式照相机分为正交投影照相机和透视投影照相机 ...