开始学习新知识:splay——tree

是个板子题,学习splay可以看博客

https://blog.csdn.net/Clove_unique/article/details/50630280

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. using namespace std;
  5. #define MAXN 1000000
  6. int ch[MAXN][],f[MAXN],size[MAXN],cnt[MAXN],key[MAXN];
  7. int sz,root;
  8. inline void clear(int x){
  9. ch[x][]=ch[x][]=f[x]=size[x]=cnt[x]=key[x]=;
  10. }
  11. inline bool get(int x){
  12. return ch[f[x]][]==x;
  13. }
  14. inline void update(int x){//更新结点x的size
  15. if(x){
  16. size[x]=cnt[x];
  17. if(ch[x][]) size[x]+=size[ch[x][]];
  18. if(ch[x][]) size[x]+=size[ch[x][]];
  19. }
  20. }
  21. inline void rotate(int x){//一次旋转
  22. //得到x的父亲,爷爷,是不是左子树
  23. int old=f[x],oldf=f[old],whichx=get(x);
  24. ch[old][whichx]=ch[x][whichx^];
  25. f[ch[old][whichx]]=old;
  26.  
  27. ch[x][whichx^]=old;f[old]=x;
  28.  
  29. f[x]=oldf;
  30. if(oldf) ch[oldf][ch[oldf][]==old]=x;
  31.  
  32. update(old);update(x);//不要忘记更新size
  33. }
  34. inline void splay(int x){
  35. for(int fa;fa=f[x];rotate(x))//再把x翻上来
  36. if(f[fa])//如果fa非根,且x和fa是同一侧,那么先翻转fa,否则先翻转x
  37. rotate((get(x)==get(fa))?fa:x);
  38.  
  39. root=x;//最后把x设为root
  40. }
  41. inline void insert(int x){
  42. if(root==){//插到空树里
  43. sz++;ch[sz][]=ch[sz][]=f[sz]=;
  44. root=sz;size[sz]=cnt[sz]=;key[sz]=x;
  45. return;
  46. }
  47. int now=root,fa=;
  48. while(){//不断往下寻找直到找到对应值
  49. if(x==key[now]){
  50. cnt[now]++;update(now);update(fa);
  51. splay(now);break;//把now置顶
  52. }
  53. fa=now;
  54. now=ch[now][key[now]<x];//往下搜索x
  55. if(now==){//新建结点
  56. sz++;ch[sz][]=ch[sz][]=;
  57. f[sz]=fa;
  58. size[sz]=cnt[sz]=;
  59. ch[fa][key[fa]<x]=sz;
  60. key[sz]=x;
  61. update(fa);
  62. splay(sz);//把sz置顶
  63. break;
  64. }
  65. }
  66. }
  67. inline int find(int x){//寻找x所在位置(排名)
  68. int now=root,ans=;
  69. while(){
  70. if(x<key[now])//往左子树搜索
  71. now=ch[now][];
  72. else {
  73. ans+=(ch[now][]?size[ch[now][]]:);
  74. //找到对应的键值,置顶now,返回
  75. if(x==key[now]){splay(now);return ans+;}
  76. ans+=cnt[now];
  77. now=ch[now][];//往右子树
  78. }
  79. }
  80. }
  81. inline int findx(int x){//找第x名的值
  82. int now=root;
  83. while(){
  84. if(ch[now][] && x<=size[ch[now][]])
  85. now=ch[now][];//往左子树搜索
  86. else {
  87. int temp=(ch[now][]?size[ch[now][]]:)+cnt[now];//
  88. if(x<=temp)
  89. return key[now];
  90. x-=temp;now=ch[now][];//往右子树搜索
  91. }
  92. }
  93. }
  94. inline int pre(){//前驱即左子树里的最大值
  95. int now=ch[root][];
  96. while(ch[now][]) now=ch[now][];
  97. return now;
  98. }
  99. inline int next(){//后继是右子树里的最小值
  100. int now=ch[root][];
  101. while(ch[now][]) now=ch[now][];
  102. return now;
  103. }
  104. inline void del(int x){
  105. int whatever=find(x);//只是把x置顶
  106. //x的个数>1
  107. if(cnt[root]>){cnt[root]--;update(root);return;}
  108. //单个x
  109. if(!ch[root][] && !ch[root][]){clear(root);root=;return;}
  110. //只有左子树或者只有右子树
  111. if(!ch[root][]){//删掉根,右儿子做根
  112. int oldroot=root;root=ch[root][];f[root]=;clear(oldroot);return;
  113. }
  114. if(!ch[root][]){
  115. int oldroot=root;root=ch[root][];f[root]=;clear(oldroot);return;
  116. }
  117. //前驱作为根(前驱是没有右儿子的),右子树挂到前驱的右子树,删掉根
  118. else {
  119. int pree=pre(),oldroot=root;
  120. splay(pree);
  121. ch[root][]=ch[oldroot][];
  122. f[ch[oldroot][]]=pree;
  123. clear(oldroot);
  124. update(pree);
  125. }
  126. }
  127. int main(){
  128. int n,op,x;
  129. scanf("%d",&n);
  130. for(int i=;i<=n;i++){
  131. scanf("%d%d",&op,&x);
  132. switch(op){
  133. case :insert(x);break;
  134. case :del(x);break;
  135. case :printf("%d\n",find(x));break;
  136. case :printf("%d\n",findx(x));break;
  137. case :insert(x);printf("%d\n",key[pre()]);del(x);break;
  138. case :insert(x);printf("%d\n",key[next()]);del(x);break;
  139. }
  140. }
  141. }

bzoj3224 splay板子的更多相关文章

  1. [bzoj] 1588 营业额统计 || Splay板子题

    原题 给出一个n个数的数列ai ,对于第i个元素ai定义\(fi=min(|ai-aj|) (1<=j<i)\),f1=a1,求\(/sumfi\) Splay板子题. Splay讲解:h ...

  2. POJ - 3481 splay板子

    Double Queue 默写splay板子 很多细节问题... #include<cstdio> #include<iostream> using namespace std ...

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

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

  4. 【填坑】bzoj3224 splay裸题

    人生第一道splay不出所料是一道裸题,一道水题,一道2k代码都不到的题 #include <cstdio> ,n,p,q; ],c[][],size[],sp[]; void rot(i ...

  5. splay板子

    1, splay的一些基本操作. 使用前要插入$-INF,+INF$保证每个点的前驱后继存在. $get$函数在$x$存在时, 调用后, 根为$x$, 否则根为$x$的前驱或后继 const int ...

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

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

  7. BZOJ[NOI2004]郁闷的出纳员 | Splay板子题

    题目: 洛谷也能评测....还有我wa了10多次的记录233 题解: 不要想得太复杂,搞一个全局变量记录一下工资的改变量Delta,这样可以等询问的时候就输出val+Delta,然后插入的时候插入x- ...

  8. P3369 【模板】普通平衡树(splay)

    P3369 [模板]普通平衡树 就是不用treap splay板子,好好背吧TAT #include<iostream> #include<cstdio> #include&l ...

  9. 【题解】 [HNOI2004]宠物收养场(Splay)

    懒得复制,戳我戳我 Solution: \(Splay\)板子,注意交换的地方,然后就是注意不要越界node[x],应该是\(node[now]\),其次就是数组可以开大点 Code: //It is ...

随机推荐

  1. ajax跨域原理以及jsonp使用

    jsonp介绍: JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题. 由于同源策略,一般来说位于 server1.example. ...

  2. src路径问题:./ 与 ../

    ./ :当前目录(相对路径) ../ :当前目录的父目录(相对路径) /:根目录(绝对路径) vue 中 @ 指向 src 文件夹: 在 build 文件夹下 webpack.base.conf.js ...

  3. CentOS6.x网易163yum源配置

    一.备份原yum源 [root@yancy ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.$(d ...

  4. python 内建函数专题

    all 用来控制 import , 甚至可以改变 _private 为 public enter , exit 用于上下文管理器 iter 用于迭代器 repr 给计算机读, str ==> s ...

  5. vue常用UI组件

    Mint UI 项目主页:http://mint-ui.github.io/#!/zh-cn demo:http://elemefe.github.io/mint-ui/#/ github地址:htt ...

  6. VMware虚拟机Mac OS X无法调整扩展硬盘大小的解决方案(转)

    使用VMware虚拟机搭建的MacOSX,在10.10以上可能会出现无法扩充磁盘大小的问题. 因为很多朋友在初次安装MacOSX的时候都默认选择40G的磁盘大小,结果用了没两天之后就发现磁盘不够用了. ...

  7. windows 查看链接数

    windows 端口链接数  查看有效 链接数: netstat -an|find " |find "ESTABLISHED" /c /c 统计: 查看链接信息: 查看当 ...

  8. CentOS6.8配置SonarQube Scanner配合SonarQube使用

    下载最新的SonarQube Scanner压缩包  https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner ...

  9. HKE和他的小朋友(矩乘快速幂)

    题面: 题目背景: HKE带着\(n\)个小朋友做游戏 题目描述: 现在有n个座位编号为\(1\)至\(n\),这些小朋友也编号\(1\)至\(n\).一开始所有小朋友都坐在相应的座位上.HKE的游戏 ...

  10. mysql select 时间戳转标准时间写法

    select  FROM_UNIXTIME(create_time, '%Y-%m-%d %H:%i:%S') as create_time from tabName