题目描述

这是一道模板题。

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

  1. 插入  x 数;
  2. 删除  x 数(若有多个相同的数,因只删除一个);
  3. 查询  x 数的排名(若有多个相同的数,因输出最小的排名);
  4. 查询排名为 x 的数;
  5. 求 x 的前趋(前趋定义为小于 x,且最大的数);
  6. 求 x 的后继(后继定义为大于 x,且最小的数)。

输入格式

第一行为 n,表示操作的个数,下面 n 行每行有两个数 opt 和 x, 表示操作的序号(1<=opt<=6)。

输出格式

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

样例

样例输入

  1. 10
  2. 1 106465
  3. 4 1
  4. 1 317721
  5. 1 460929
  6. 1 644985
  7. 1 84185
  8. 1 89851
  9. 6 81968
  10. 1 492737
  11. 5 493598

样例输出

  1. 106465
  2. 84185
  3. 492737

数据范围与提示

 1<=n<=105,-107<=x<=107
 ___________________________________________________________________________
 
fhq_treap模板
___________________________________________________________________________
  1. 1 #include<bits/stdc++.h>
  2. 2 using namespace std;
  3. 3 const int maxn=1e5+10;
  4. 4 struct node
  5. 5 {
  6. 6 int val,lc,rc,siz,rd;
  7. 7 }tr[maxn];
  8. 8 int cnt,root,n;
  9. 9 int newnode(int v)
  10. 10 {
  11. 11 ++cnt;
  12. 12 tr[cnt].val=v;
  13. 13 tr[cnt].siz=1;
  14. 14 tr[cnt].rd=rand();
  15. 15 tr[cnt].lc=tr[cnt].rc=0;
  16. 16 return cnt;
  17. 17 }
  18. 18 void update(int cur)
  19. 19 {
  20. 20 tr[cur].siz=tr[tr[cur].lc].siz+tr[tr[cur].rc].siz+1;
  21. 21 }
  22. 22 int merge(int x,int y)
  23. 23 {
  24. 24 if(x*y==0)return x+y;
  25. 25 if(tr[x].rd<tr[y].rd)
  26. 26 {
  27. 27 tr[x].rc=merge(tr[x].rc,y);
  28. 28 update(x);
  29. 29 return x;
  30. 30 }
  31. 31 else
  32. 32 {
  33. 33 tr[y].lc=merge(x,tr[y].lc);
  34. 34 update(y);
  35. 35 return y;
  36. 36 }
  37. 37 }
  38. 38 void split(int cur,int v,int &x,int &y)
  39. 39 {
  40. 40 if(!cur)x=y=0;
  41. 41 else
  42. 42 {
  43. 43 if(tr[tr[cur].lc].siz+1<=v)
  44. 44 {
  45. 45 x=cur;
  46. 46 split(tr[cur].rc,v-tr[tr[cur].lc].siz-1,tr[cur].rc,y);
  47. 47 update(cur);
  48. 48 }
  49. 49 else
  50. 50 {
  51. 51 y=cur;
  52. 52 split(tr[cur].lc,v,x,tr[cur].lc);
  53. 53 update(cur);
  54. 54 }
  55. 55 }
  56. 56 }
  57. 57 void splitv(int cur,int v,int &x,int &y)
  58. 58 {
  59. 59 if(!cur)x=y=0;
  60. 60 else
  61. 61 {
  62. 62 if(tr[cur].val<=v)
  63. 63 {
  64. 64 x=cur;
  65. 65 splitv(tr[cur].rc,v,tr[cur].rc,y);
  66. 66 update(cur);
  67. 67 }
  68. 68 else
  69. 69 {
  70. 70 y=cur;
  71. 71 splitv(tr[cur].lc,v,x,tr[cur].lc);
  72. 72 update(cur);
  73. 73 }
  74. 74 }
  75. 75 }
  76. 76 void insert(int v)
  77. 77 {
  78. 78 int x,y;
  79. 79 splitv(root,v,x,y);
  80. 80 root=merge(merge(x,newnode(v)),y);
  81. 81 }
  82. 82 void del(int v)
  83. 83 {
  84. 84 int x,y,z;
  85. 85 splitv(root,v,x,z);
  86. 86 splitv(x,v-1,x,y);
  87. 87 y=merge(tr[y].lc,tr[y].rc);
  88. 88 root=merge(merge(x,y),z);
  89. 89 }
  90. 90 void find(int v)
  91. 91 {
  92. 92 int x,y;
  93. 93 splitv(root, v-1,x,y);
  94. 94 printf("%d\n",tr[x].siz+1);
  95. 95 root=merge(x,y);
  96. 96 }
  97. 97 void kth(int now,int v)
  98. 98 {
  99. 99 int cur=now;
  100. 100 if(v>tr[now].siz || v<1)return ;
  101. 101 while(cur)
  102. 102 {
  103. 103 if(tr[tr[cur].lc].siz+1==v)
  104. 104 {
  105. 105 printf("%d\n",tr[cur].val);
  106. 106 return ;
  107. 107 }
  108. 108 else if(tr[tr[cur].lc].siz >= v)cur=tr[cur].lc;
  109. 109 else
  110. 110 {
  111. 111 v-=tr[tr[cur].lc].siz+1;
  112. 112 cur=tr[cur].rc;
  113. 113 }
  114. 114 }
  115. 115 }
  116. 116 void pre(int v)
  117. 117 {
  118. 118 int x,y,z;
  119. 119 splitv(root,v-1,x,y);
  120. 120 kth(x,tr[x].siz);
  121. 121 root=merge(x,y);
  122. 122 }
  123. 123 void next(int v)
  124. 124 {
  125. 125 int x,y,z;
  126. 126 splitv(root,v,x,y);
  127. 127 kth(y,1);
  128. 128 root=merge(x,y);
  129. 129 }
  130. 130 int main()
  131. 131 {
  132. 132 scanf("%d",&n);
  133. 133 for(int op,x,i=0;i<n;++i)
  134. 134 {
  135. 135 scanf("%d%d",&op,&x);
  136. 136 if(op==1)insert(x);
  137. 137 else if(op==2)del(x);
  138. 138 else if(op==3)find(x);
  139. 139 else if(op==4)kth(root,x);
  140. 140 else if(op==5)pre(x);
  141. 141 else next(x);
  142. 142 }
  143. 143 return 0;
  144. 144 }

LOJ104 普通平衡树的更多相关文章

  1. BZOJ3224/LOJ104 普通平衡树 pb_ds库自带红黑树

    您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x2. 删除x(若有多个相同的数,因只删除一个)3. 查询x的排名(若有多个相同的数,因输出最小的排名)4. 查询排名为x的数5. ...

  2. BZOJ3224/LOJ104 普通平衡树 treap(树堆)

    您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x2. 删除x(若有多个相同的数,因只删除一个)3. 查询x的排名(若有多个相同的数,因输出最小的排名)4. 查询排名为x的数5. ...

  3. [BZOJ3223]Tyvj 1729 文艺平衡树

    [BZOJ3223]Tyvj 1729 文艺平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区 ...

  4. [BZOJ3224]Tyvj 1728 普通平衡树

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

  5. BZOJ3223: Tyvj 1729 文艺平衡树 [splay]

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3595  Solved: 2029[Submit][Sta ...

  6. [普通平衡树treap]【学习笔记】

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 9046  Solved: 3840[Submit][Sta ...

  7. BZOJ 3224: Tyvj 1728 普通平衡树

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 9629  Solved: 4091[Submit][Sta ...

  8. BZOJ 3223: Tyvj 1729 文艺平衡树

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3628  Solved: 2052[Submit][Sta ...

  9. 【Splay】bzoj3223-Tyvj1729文艺平衡树

    一.题目 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 ...

随机推荐

  1. [LeetCode]147. Insertion Sort List链表排序

    插入排序的基本思想 把排好的放在一个新的变量中,每次拿出新的,排进去 这个新的变量要有超前节点,因为第一个节点可能会有变动 public ListNode insertionSortList(List ...

  2. 使用UML工具分析类图与类的关系-bouml(java和C++)

    在分析类之间的关系时可以借助工具来实现. bouml是一个UML分析工具,最新的版本是收费的,但是之前的版本是免费的. 这里使用的是4.23版. Bouml安装: 安装软件就按照流程走就行了.但是第一 ...

  3. maven 父子项目 pom

    父项目 <!--项目 id--> <artifactId>expressway-cloud-travel</artifactId> <!-- 子模块--> ...

  4. Mysql 实战关于date,datetime,timestamp类型使用

    最近在做一个项目 项目中 不同的小伙伴同时在不同的业务模块中用到了date,datetime,timestamp这三个类型 特别是datetime,timestamp这两个 如果不能理解到位  其实很 ...

  5. sprignAOP那些术语

    那些AOP术语 初看这么多术语,一下子都不好接受,慢慢来,很快就会搞懂.通知.增强处理(Advice) 就是你想要的功能,也就是上说的安全.事物.日志等.你给先定义好,然后再想用的地方用一下.包含As ...

  6. 5.汇编实现裸机LED

    首先:操作LED就要操作GPIO  alpha的芯片是NXP的IMX6ULL  其GPIO和STM32的命名有所区别 可以看到IMX6ULL的GPIO以其功能进行命名,对应上图中PAD之后的部分 即G ...

  7. Hbase相关参数详解

    转载:http://www.cnblogs.com/nexiyi/p/hbase_config_94.html 版本:0.94-cdh4.2.1 hbase-site.xml配置 hbase.tmp. ...

  8. PHPExcel-Helper快速构建Excel

    项目介绍 PHPExcel-Helper是什么? PHPExcel辅助开发类,帮助开发者快速创建各类excel. github PHPExcel-Helper存在的意义? 官方phpexcel库功能全 ...

  9. PHP 打水印功能

    /** * @param $str 需要打水印的文字 * @param int $size 文字大小 * @param int $red 文字的颜色 rgb r * @param int $gree ...

  10. 容器编排系统K8s之APIService资源

    前文我们聊到了k8s上crd资源的使用和相关说明,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14267400.html:今天我们来了解下k8s的第二种扩展 ...