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

  1. 插入x数

  2. 删除x数(若有多个相同的数,因只删除一个)

  3. 查询x数的排名(若有多个相同的数,因输出最小的排名)

  4. 查询排名为x的数

  5. 求x的前驱(前驱定义为小于x,且最大的数)

  6. 求x的后继(后继定义为大于x,且最小的数)

--by 洛谷;

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



  话说,没时间写题解啊——

  不过,也就是个平衡树的模板题;

就存下代码吧

  treap哟;

  好像很少见写treap的,但常数还是挺小的orz;

  哎,最近怎么老写模板啊?

  代码如下:

  1. #include<cstdio>
  2. #include<cstdlib>
  3. using namespace std;
  4. #define INF 2147483647
  5. int n;
  6. struct poo
  7. {
  8. int size,value,key,cnt;
  9. int ch[];
  10. }data[];
  11. int tot,root,x;
  12. int make_data(int );
  13. void insert(int&);
  14. void roll(int&);
  15. int find( );
  16. int rank( );
  17. void del(int&);
  18. int las(int );
  19. int nex(int );
  20. void up(int );
  21. int main()
  22. {
  23. int i,j;
  24. data[].value=INF;data[].key=INF;
  25. scanf("%d",&n);
  26. for(i=;i<=n;i++){
  27. scanf("%d%d",&j,&x);
  28. switch(j){
  29. case :insert(root);break;
  30. case : del(root);break;
  31. case : printf("%d\n",rank( ));break;
  32. case : printf("%d\n",find( ));break;
  33. case : printf("%d\n", las(root));break;
  34. case : printf("%d\n", nex(root));break;
  35. }
  36. }
  37. }
  38. int make_data(int value)
  39. {
  40. tot++;
  41. data[tot].cnt++;
  42. data[tot].key=(rand()/+rand()/);
  43. data[tot].size=;
  44. data[tot].value=value;
  45. return tot;
  46. }
  47. void insert(int &now)
  48. {
  49. if(now==){
  50. now=make_data(x);
  51. return;
  52. }
  53. if(data[now].value==x){
  54. data[now].cnt++;
  55. data[now].size++;
  56. }
  57. else{
  58. int wh=x < data[now].value ? : ;
  59. insert(data[now].ch[wh]);
  60. if(data[now].key>=data[data[now].ch[wh]].key)
  61. roll(now);
  62. }
  63. up(now);
  64. }
  65. void roll(int &now)
  66. {
  67. int wh=data[data[now].ch[]].key<data[data[now].ch[]].key?:;
  68. int son=data[now].ch[wh];
  69. data[now].ch[wh]=data[son].ch[wh^];
  70. data[son].ch[wh^]=now;
  71. up(now);
  72. now=son;
  73. }
  74. int find()
  75. {
  76. int now=root;
  77. int ls,rs;
  78. ls=data[now].ch[];rs=data[now].ch[];
  79. while(x<=data[ls].size||x>data[now].size-data[rs].size){
  80. if(data[ls].size>=x)
  81. now=ls;
  82. else{
  83. x=x+data[rs].size-data[now].size;
  84. now=rs;
  85. }
  86. ls=data[now].ch[];rs=data[now].ch[];
  87. }
  88. return data[now].value;
  89. }
  90. int rank()
  91. {
  92. int now=root,ans=;
  93. int ls=data[now].ch[],rs=data[now].ch[];
  94. while(x!=data[now].value&&x!=)
  95. {
  96. if(x<data[now].value)
  97. now=ls;
  98. else{
  99. ans+=data[now].size-data[rs].size;
  100. now=rs;
  101. }
  102. ls=data[now].ch[];rs=data[now].ch[];
  103. }
  104. return ans+data[ls].size+;
  105. }
  106. void del(int &now)
  107. {
  108. if(data[now].value==x){
  109. if(data[now].cnt==){
  110. if(data[now].ch[]*data[now].ch[]==){
  111. now=data[now].ch[]+data[now].ch[];
  112. return ;
  113. }
  114. roll(now);
  115. int wh=data[data[now].ch[]].value==x?:;
  116. del(data[now].ch[wh]);
  117. }
  118. else{
  119. data[now].size--; data[now].cnt--;
  120. }
  121. }
  122. else{
  123. int wh=data[now].value>x?:;
  124. del(data[now].ch[wh]);
  125. }
  126. up(now);
  127. }
  128. int las(int now)
  129. {
  130. int ans=,an=;
  131. if(!now)return ;
  132. if(data[now].value<x){
  133. ans=data[now].value;
  134. an=las(data[now].ch[]);
  135. ans=an!=?an:ans;
  136. }
  137. else{
  138. ans=las(data[now].ch[]);
  139. }
  140. return ans;
  141. }
  142. int nex(int now)
  143. {
  144. int ans=,an=;
  145. if(!now)return ;
  146. if(data[now].value>x){
  147. ans=data[now].value;
  148. an=nex(data[now].ch[]);
  149. ans=an!=?an:ans;
  150. }
  151. else{
  152. ans=nex(data[now].ch[]);
  153. }
  154. return ans;
  155. }
  156. void up(int now)
  157. {
  158. data[now].size=data[data[now].ch[]].size+data[data[now].ch[]].size+data[now].cnt;
  159. }
  160. //treap on the 2017.1.21
  161. //10
  162. //1 5
  163. //4 1
  164. //1 6
  165. //1 7
  166. //1 10
  167. //1 3
  168. //1 4
  169. //6 2
  170. //1 8
  171. //5 9
  172. //
  173. //14
  174. //1 5
  175. //1 6
  176. //1 7
  177. //1 10
  178. //1 3
  179. //1 4
  180. //1 8
  181. //3 3
  182. //3 4
  183. //3 5
  184. //3 6
  185. //4 5
  186. //4 6
  187. //4 7

祝AC哟;

普通平衡树Tyvj1728、luogu P3369 (treap)的更多相关文章

  1. [luogu P3369]【模板】普通平衡树(Treap/SBT)

    [luogu P3369][模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删 ...

  2. 数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) #include <cstdio> #define Max 100005 #define Inline _ ...

  3. 替罪羊树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 闲的没事,把各种平衡树都写写 比较比较... 下面是替罪羊树 #include <cstdio> #inc ...

  4. 红黑树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 近几天闲来无事...就把各种平衡树都写了一下... 下面是红黑树(Red Black Tree) 喜闻乐见拿到了luo ...

  5. 【数据结构】平衡树splay和fhq—treap

    1.BST二叉搜索树 顾名思义,它是一棵二叉树. 它满足一个性质:每一个节点的权值大于它的左儿子,小于它的右儿子. 当然不只上面那两种树的结构. 那么根据性质,可以得到该节点左子树里的所有值都比它小, ...

  6. 【luogu P3369 普通平衡树(Treap/SBT)】 模板 Splay

    题目链接:https://www.luogu.org/problemnew/show/P3369 #include <cstdio> #include <algorithm> ...

  7. fhq treap ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : LibreOJ #104. 普通平衡树 #include <cstdio> #include <iostream> #include <algorithm ...

  8. 普通平衡树Tyvj1728、luogu P3369 (splay)

    存个模板,这次是splay的: 题目见这个题解: <--(鼠标移到这儿) 代码如下: #include<cstdio> #define INF 2147483647 using na ...

  9. 【luogu P3369 【模板】普通平衡树(Treap/SBT)】 模板 Scapegoat Tree

    #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> ...

随机推荐

  1. 利用python 学习数据分析 (学习一)

    内容学习自: Python for Data Analysis, 2nd Edition         就是这本 纯英文学的很累,对不对取决于百度翻译了 前情提要: 各种方法贴: https://w ...

  2. java四行代码实现图片下载

    如下: InputStream in = new URL("http://www.updown/thumbnail.jpg).openStream(); Path temp = Paths. ...

  3. 【算法笔记】A1039 Course List for Student

    https://pintia.cn/problem-sets/994805342720868352/problems/994805447855292416 题意: 有N个学生,K节课.给出选择每门课的 ...

  4. 升级vue-cli为 cli3 并创建项目

    一.升级npm install -g @vue/cli 二.创建项目 1.vue  create vue3-project 下面会提示让你配置下自己想要用到的功能,然后它会自动帮你安装,这个看自己需求 ...

  5. scrapyd的安装

    .安装 pip3 install scrapyd 二.配置 安装完毕之后,需要新建一个配置文件/etc/scrapyd/scrapyd.conf,Scrapyd在运行的时候会读取此配置文件. 在Scr ...

  6. 【GIS新探索】GeoHash原理和编解码实现

    1.什么是GeoHash geohash基本原理是将地球理解为一个二维平面,将平面递归分解成更小的子块,每个子块在一定经纬度范围内拥有相同的编码.不好理解,没关系,我来找个图. 就像上面这张图,一个坐 ...

  7. ftpClient.retrieveFileStream导致FTPClient的后面操作失败

    问题代码: FTPFile[] fs = ftpClient.listFiles(); for (FTPFile ff : fs) { if (ff.getName().equals(fileName ...

  8. 关于微信企业号操作api的sdk封装 (.net)

    做微信的第三方开发业半年多了 现在献上微信企业号的操作sdk(包括源码) 本人水平有限 望大家多提意见 下载地址献上:下载

  9. C#集合通论

    前言 写这篇文章的最初动力是来自于一次笔试经历.有一道笔试题大概是这样的:程序使用一个txt文件来存储操作记录.存储记录是多行字符串,每一行代表一次操作记录,格式如下:用户名+操作事项名称+操作时间. ...

  10. 计算2..n的素数

    def check(2) , do: true def check(n) when n >2 do b = for x <- (Enum.into 2..n-1,[]),do: x if ...