本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!

题目链接:BZOJ3224

正解:$Treap$

解题报告:

  $Treap$其实就是二叉搜索树啦,加入了随机化权值之后可以保证树的形态比较平衡。

  $Treap$既是一棵二叉搜索树又是一个大根堆(小根堆也行,随意啦),每次$insert$了之后给这个节点$rand$一个权值就好了,然后每次需要保证堆的性质,所以要维护一个向上旋转的操作。

  这就是旋转式的$Treap$了,挺simple的。

  1. //It is made by ljh2000
  2. //有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
  3. #include <iostream>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <cstdio>
  7. #include <cmath>
  8. #include <algorithm>
  9. #include <ctime>
  10. #include <vector>
  11. #include <queue>
  12. #include <map>
  13. #include <set>
  14. #include <string>
  15. #include <complex>
  16. #include <bitset>
  17. using namespace std;
  18. typedef long long LL;
  19. typedef long double LB;
  20. typedef complex<double> C;
  21. const double pi = acos(-1);
  22. const int MAXN = 100011;
  23. int n,rt,tot,tr[MAXN][2],size[MAXN],r[MAXN],val[MAXN];
  24. //维护按权值的二叉搜索树,同时是随机权值的大根堆
  25. //相等的均靠左
  26. inline void update(int x){ size[x]=size[tr[x][0]]+size[tr[x][1]]+1; }
  27. inline int getint(){
  28. int w=0,q=0; char c=getchar(); while((c<'0'||c>'9') && c!='-') c=getchar();
  29. if(c=='-') q=1,c=getchar(); while (c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w;
  30. }
  31.  
  32. inline void R(int &p,bool k){//把x的左/右儿子旋转上来
  33. int t=tr[p][k]; tr[p][k]=tr[t][k^1]; tr[t][k^1]=p;
  34. update(p); update(t); p=t;
  35. }
  36.  
  37. inline void insert(int &p,int x){
  38. if(!p) { p=++tot; val[p]=x; size[p]=1; r[p]=rand(); return ; }
  39. size[p]++;//!!!
  40. if(x<=val[p]) insert(tr[p][0],x); else insert(tr[p][1],x);
  41. bool k=(x>val[p]);
  42. if(r[ tr[p][k] ] > r[p]) R(p,k);//不满足大根堆性质,往上旋转
  43. }
  44.  
  45. inline void out(int &p){//删除当前节点,不断旋转,直到没有左儿子或者没有右儿子就可以结束了
  46. if(!tr[p][0] || !tr[p][1]) { p=tr[p][0]+tr[p][1]; return ; }
  47. bool k=(r[ tr[p][1] ]>r[ tr[p][0] ]);//把key偏大的那个儿子旋转上来
  48. R(p,k); size[p]--;//!!!
  49. out(tr[p][k^1]);
  50. }
  51.  
  52. inline void del(int &p,int k){//把当前子树中rank为k的结点删除
  53. size[p]--;//!!!在最前面呀...
  54. if(size[tr[p][0]]+1==k) { out(p); return ; }
  55. if(size[tr[p][0]]>=k) del(tr[p][0],k);
  56. else del(tr[p][1]/*!!!*/,k-size[tr[p][0]]-1);
  57. }
  58.  
  59. inline int kth(int x,int k){//查询rank为k的数,rank最小的那个
  60. while(x) {
  61. if(size[tr[x][0]]+1==k) return val[x];
  62. if(k<=size[tr[x][0]]) x=tr[x][0];
  63. else k-=size[tr[x][0]]+1,x=tr[x][1];
  64. }
  65. return 0;
  66. }
  67.  
  68. inline int rank(int x,int k){//查询>=k的第一个数的rank,最靠左的那个
  69. int tot=1;
  70. while(x) {
  71. if(k<=val[x]) x=tr[x][0];
  72. else tot+=size[tr[x][0]]+1,x=tr[x][1];
  73. }
  74. return tot;
  75. }
  76.  
  77. inline void work(){
  78. srand(23333);
  79. n=getint(); int type,x;
  80. while(n--) {
  81. type=getint(); x=getint();
  82. if(type==1) {
  83. insert(rt,x);
  84. }
  85. else if(type==2) {
  86. del(rt,rank(rt,x));
  87. }
  88. else if(type==3) {
  89. printf("%d\n",rank(rt,x));
  90. }
  91. else if(type==4) {
  92. printf("%d\n",kth(rt,x));
  93. }
  94. else if(type==5) {
  95. printf("%d\n", kth( rt, rank(rt,x)-1 ) );
  96. }
  97. else {
  98. printf("%d\n", kth( rt, rank(rt,x+1) ) );
  99. }
  100. }
  101. }
  102.  
  103. int main()
  104. {
  105. #ifndef ONLINE_JUDGE
  106. freopen("3224.in","r",stdin);
  107. freopen("3224.out","w",stdout);
  108. #endif
  109. work();
  110. return 0;
  111. }
  112. //有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。

  

BZOJ3224 Tyvj 1728 普通平衡树(Treap)的更多相关文章

  1. [BZOJ3224] [Tyvj 1728] 普通平衡树 (treap)

    Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相 ...

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

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

  3. bzoj3224: Tyvj 1728 普通平衡树(平衡树)

    bzoj3224: Tyvj 1728 普通平衡树(平衡树) 总结 a. cout<<(x=3)<<endl;这句话输出的值是3,那么对应的,在splay操作中,当父亲不为0的 ...

  4. BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 7390  Solved: 3122 [Submit][S ...

  5. bzoj3224 Tyvj 1728 普通平衡树(名次树+处理相同)

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

  6. BZOJ 3224: Tyvj 1728 普通平衡树 treap

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

  7. bzoj3224: Tyvj 1728 普通平衡树(splay)

    3224: Tyvj 1728 普通平衡树 题目:传送门 题解: 啦啦啦啦又来敲个模版水经验啦~ 代码: #include<cstdio> #include<cstring> ...

  8. 【权值线段树】bzoj3224 Tyvj 1728 普通平衡树

    一个板子. #include<cstdio> #include<algorithm> using namespace std; #define N 100001 struct ...

  9. BZOJ3224——Tyvj 1728 普通平衡树

    1.题目大意:数据结构题,是treap,全都是treap比较基本的操作 2.分析:没啥思考的 #include <cstdio> #include <cstdlib> #inc ...

随机推荐

  1. 浅析Linux中的进程调度

    2016-11-22 前面在看软中断的时候,牵扯到不少进程调度的知识,这方面自己确实一直不怎么了解,就趁这个机会好好学习下. 现代的操作系统都是多任务的操作系统,尽管随着科技的发展,硬件的处理器核心越 ...

  2. Incorrect key file for table ' '; try to repair it

    场景:为有150W的数据表增加字段时,报错 解决:在my.ini配置临时目录configure tmpdir. Where MySQL Stores Temporary Files

  3. 如何制作一款HTML5 RPG游戏引擎——第二篇,烟雨+飞雪效果

    今天我们来实现烟雨+飞雪效果.首先来说,一款经典的RPG游戏难免需要加入天气的变化.那么为了使我们的RPG游戏引擎更完美,我们就只好慢慢地实现它. 本文为该系列文章的第二篇,如果想了解以前的文章可以看 ...

  4. mysql 系统变量和session变量

    mysql系统变量包括全局变量(global)和会话变量(session),global变量对所有session生效,session变量包括global变量.mysql调优必然会涉及这些系统变量的调整 ...

  5. C++实现去掉string字符串前后的空白字符

    C++标准库提供的字符串类string没有提供类似CString中Trim方法,该方法功能为去除字符串前后的空白字符.利用string自身一些方法可以很容易实现该功能. 如下: void Trim(s ...

  6. Linux系统——date命令

    date命令 作用:用来显示或设定系统的日期与时间. 参数 -d<字符串>:显示字符串所指的日期与时间.字符串前后必须加上双引号: -s<字符串>:根据字符串来设置日期与时间. ...

  7. windows的cmd命令切换磁盘路径

  8. TabLayout与ViewPager同步后Tab的标题不显示

    一.概述 1.1 问题描述 TabLayout+ViewPager后,TabLayout的TabItem不显示的问题: 1.2 截图 二.结论 mTabs.setupWithViewPager(mVi ...

  9. Jquery Easy UI Datagrid 上下移动批量保存数据

    DataGrid with 上下移动批量保存数据 通过前端变量保存修改数据集合,一次性提交后台执行 本想结合easyui 自带的$('#dg').datagrid('getChanges'); 方法来 ...

  10. 关于hashmap 与concurrentHashMap

    hashmap是不安全的,要实现安全,可以用Collections里面的synchronizedMap包裹来实现安全,或者用concurrentMap, 注意:hashtable是安全的 从JDK1. ...