安利splay讲解:

[洛谷日报第62期]Splay简易教程

【模板】普通平衡树(luogu)

Description

题目描述

您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:

  1. 插入 xx 数
  2. 删除 xx 数(若有多个相同的数,因只删除一个)
  3. 查询 xx 数的排名(排名定义为比当前数小的数的个数 +1+1 )
  4. 查询排名为 xx 的数
  5. 求 xx 的前驱(前驱定义为小于 xx,且最大的数)
  6. 求 xx 的后继(后继定义为大于 xx,且最小的数)

输入格式

第一行为 nn,表示操作的个数,下面 nn 行每行有两个数 \text{opt}opt 和 xx,\text{opt}opt 表示操作的序号( 1 \leq \text{opt} \leq 61≤opt≤6 )

输出格式

对于操作 3,4,5,63,4,5,6 每行输出一个数,表示对应答案

Code

  1. #include <iostream>
  2. using namespace std;
  3. const int N=1e5+;
  4. //1:插入xx数
  5. //2:删除xx数(若有多个相同的数,因只删除一个)
  6. //3:查询xx数的排名(排名定义为比当前数小的数的个数+1。若有多个相同的数,因输出最小的排名)
  7. //4:查询排名为xx的数
  8. //5:求xx的前驱(前驱定义为小于xx,且最大的数)
  9. //6:求xx的后继(后继定义为大于xx,且最小的数)
  10. int n,x,opt,cnt[N],size[N],val[N],tot,ch[N][],rt,fa[N];
  11. struct Splay
  12. {
  13. void push_up(int x)
  14. {
  15. size[x]=size[ch[x][]]+size[ch[x][]]+cnt[x];
  16. }
  17. bool get(int x)
  18. {
  19. return x==ch[fa[x]][];
  20. }
  21. void clear(int x)
  22. {
  23. size[x]=ch[x][]=ch[x][]=cnt[x]=val[x]=fa[x]=;
  24. }
  25. void rotate(int x)
  26. {
  27. int y=fa[x],z=fa[y],wh=get(x);
  28. fa[ch[x][wh^]]=y;
  29. ch[y][wh]=ch[x][wh^];
  30. ch[x][wh^]=y;
  31. fa[x]=z,fa[y]=x;
  32. if(z) ch[z][y==ch[z][]]=x;
  33. push_up(y),push_up(x);
  34. }
  35. void splay(int x)
  36. {
  37. for(int f=fa[x];f=fa[x],f;rotate(x))
  38. if(fa[f]) rotate(get(f)==get(x)?f:x);
  39. rt=x;
  40. }
  41. int nxt()
  42. {
  43. int now=ch[rt][];
  44. while(ch[now][]) now=ch[now][];
  45. return now;
  46. }
  47. int pre()
  48. {
  49. int now=ch[rt][];
  50. while(ch[now][]) now=ch[now][];
  51. return now;
  52. }
  53. int rk(int x)
  54. {
  55. int res=,now=rt;
  56. while()
  57. {
  58. if(x<val[now]) now=ch[now][];
  59. else
  60. {
  61. res+=size[ch[now][]];
  62. if(x==val[now])
  63. {
  64. splay(now);
  65. return res+;
  66. }
  67. res+=cnt[now],now=ch[now][];
  68. }
  69. }
  70. }
  71. int kth(int x)
  72. {
  73. int now=rt;
  74. while()
  75. {
  76. if(ch[now][] && x<=size[ch[now][]]) now=ch[now][];
  77. else
  78. {
  79. x-=size[ch[now][]]+cnt[now];
  80. if(x<=) return val[now];
  81. now=ch[now][];
  82. }
  83. }
  84. }
  85. void ins(int x)
  86. {
  87. if(!rt)
  88. {
  89. rt=++tot,cnt[tot]=,val[tot]=x;
  90. push_up(tot);
  91. return ;
  92. }
  93. int now=rt,par=;
  94. while()
  95. {
  96. if(val[now]==x)
  97. {
  98. cnt[now]++;
  99. push_up(now),push_up(par);
  100. splay(now);
  101. return ;
  102. }
  103. par=now,now=ch[now][x>val[now]];
  104. if(!now)
  105. {
  106. cnt[++tot]=,val[tot]=x,fa[tot]=par;
  107. ch[par][x>val[par]]=tot;
  108. push_up(tot),push_up(par);
  109. splay(tot);
  110. return ;
  111. }
  112. }
  113. }
  114. void del(int x)
  115. {
  116. rk(x);
  117. if(cnt[rt]>) cnt[rt]--,push_up(rt);
  118. else if(!ch[rt][] && !ch[rt][]) clear(rt),rt=;
  119. else if(!ch[rt][])
  120. {
  121. int now=rt;
  122. rt=ch[rt][],fa[rt]=;
  123. clear(now);
  124. }
  125. else if(!ch[rt][])
  126. {
  127. int now=rt;
  128. rt=ch[rt][],fa[rt]=;
  129. clear(now);
  130. }
  131. else
  132. {
  133. int x=pre(),now=rt;
  134. splay(x);
  135. fa[ch[now][]]=rt;
  136. ch[rt][]=ch[now][];
  137. clear(now);
  138. push_up(rt);
  139. }
  140. }
  141. }tree;
  142. int main()
  143. {
  144. ios::sync_with_stdio(false);
  145. cin>>n;
  146. while(n--)
  147. {
  148. cin>>opt>>x;
  149. if(opt==) tree.ins(x);
  150. else if(opt==) tree.del(x);
  151. else if(opt==) cout<<tree.rk(x)<<endl;
  152. else if(opt==) cout<<tree.kth(x)<<endl;
  153. else if(opt==) tree.ins(x),cout<<val[tree.pre()]<<endl,tree.del(x);
  154. else if(opt==) tree.ins(x),cout<<val[tree.nxt()]<<endl,tree.del(x);
  155. }
  156. return ;
  157. }

【模板】普通平衡树(权值splay)的更多相关文章

  1. 【模板】平衡树——Treap和Splay

    二叉搜索树($BST$):一棵带权二叉树,满足左子树的权值均小于根节点的权值,右子树的权值均大于根节点的权值.且左右子树也分别是二叉搜索树.(如下) $BST$的作用:维护一个有序数列,支持插入$x$ ...

  2. [BZOJ3196] 二逼平衡树 [权值线段树套位置平衡树]

    题面 洛咕题面 思路 没错我就是要不走寻常路! 看看那些外层位置数据结构,必须二分的,$O(n\log^3 n)$的做法吧! 看看那些cdq分治/树状数组套线段树的,空间$O(n\log^2 n)$挤 ...

  3. [BZOJ3600] 没有人的算术 [重量平衡树+权值线段树]

    题面 传送门 思路 这道题目是陈立杰论文<重量平衡树和后缀平衡树在信息学奥赛中的应用 >中关于重量平衡树维护序列排名算法的一个应用 具体方法为:令根节点保存一个实数区间$[0,1]$ 若当 ...

  4. cogs 1829. [Tyvj 1728]普通平衡树 权值线段树

    1829. [Tyvj 1728]普通平衡树 ★★★   输入文件:phs.in   输出文件:phs.out   简单对比时间限制:1 s   内存限制:1000 MB [题目描述] 您需要写一种数 ...

  5. [ZJOI2006]书架(权值splay)

    [ZJOI2006]书架(luogu) Description 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看 ...

  6. luoguP3391[模板]文艺平衡树(Splay) 题解

    链接一下题目:luoguP3391[模板]文艺平衡树(Splay) 平衡树解析 这里的Splay维护的显然不再是权值排序 现在按照的是序列中的编号排序(不过在这道题目里面就是权值诶...) 那么,继续 ...

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

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

  8. 【权值分块】bzoj3224 Tyvj 1728 普通平衡树

    权值分块和权值线段树的思想一致,离散化之后可以代替平衡树的部分功能. 部分操作的时间复杂度: 插入 删除 全局排名 全局K大 前驱 后继 全局最值 按值域删除元素 O(1) O(1) O(sqrt(n ...

  9. [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树

    二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...

随机推荐

  1. codeforces 677D(分层图dp)

    Codeforces 677D 传送门:https://codeforces.com/contest/677/problem/D 题意: 给你一个n*m的方格图,每个点有一个权值val,现在要求你从坐 ...

  2. 利用Aspose.cells 将查询出的数据导出为excel,并在浏览器中下载。

    正题前的唠叨 本人是才出来工作不久的小白菜一颗,技术很一般,总是会有遇到一些很简单的问题却不知道怎么做,这些问题可能是之前解决过的.发现这个问题,想着提升一下自己的技术水平,将一些学的新的‘好’东西记 ...

  3. ApkTool工具

    ApkTool:   一款很好的反编译工具,支持Linux和Windows. 如何使用: 1:需要一个JAVA环境.由于之前已经装过JAVA 相关JDK,JRE,不赘述. 2:下载ApkTool工具: ...

  4. Wannafly挑战赛25 因子 [数论]

    一.题意 令 X = n!, 给定一大于1的正整数p 求一个k使得 p ^k | X 并且 p ^(k + 1) 不是X的因子 输入为两个数n, p (1e18>= n>= 10000 & ...

  5. 多线程之美8一 AbstractQueuedSynchronizer源码分析<二>

    目录 AQS的源码分析 该篇主要分析AQS的ConditionObject,是AQS的内部类,实现等待通知机制. 1.条件队列 条件队列与AQS中的同步队列有所不同,结构图如下: 两者区别: 1.链表 ...

  6. pyinstaller打包py脚本Warning:lib not found等相关问题

    小爬从使用Pyinstaller打包py为exe文件以来,一直都会碰到Warning:lib not found等相关问题,诸如: 虽然大多数时候,您像我一样忽略这些warning,打包后的exe也能 ...

  7. 0001 认识WEB( 标准)

    认识WEB 1. 认识网页 网页主要由文字.图像和超链接等元素构成.当然,除了这些元素,网页中还可以包含音频.视频以及Flash等. 思考: 网页是如何形成的呢? 总结 网页有图片.链接.文字等元素组 ...

  8. Asp.net导入Excel并读取数据

    protected void Button1_Click(object sender, EventArgs e) { if (station.HasFile == false)//HasFile用来检 ...

  9. SpringBoot系列——启用https

    前言 有时候我们需要使用https安全协议,本文记录在SpringBoot项目启用https 生成证书 自签名证书 使用java jdk自带的生成SSL证书的工具keytool生成自己的证书 1.打开 ...

  10. $Noip2013/Luogu1966$ 火柴排队 贪心+离散化+逆序对

    $Luogu$ $Description$ 给定等长的$a,b$两个序列.每次可以交换一个序列中相邻两个数.求最小的交换次数使得$\sum(a_i-b_i)^2$最小. $Sol$ 交换后的序列一定满 ...