解题关键:由于需要根据平衡进行重建,所以不能进行去重,否则无法保证平衡性。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cstdlib>
  5. #include<iostream>
  6. #include<cmath>
  7. #include<vector>
  8. using namespace std;
  9. typedef long long ll;
  10.  
  11. const double alpha=0.7;
  12. const int N=1e5+;
  13. int n;
  14.  
  15. namespace ScapegoatTree{
  16. struct node{
  17. int l,r,v,sz,valid;
  18. bool del;
  19. }t[N<<];
  20. int tot=,rt=;
  21. #define ls(o) t[o].l
  22. #define rs(o) t[o].r
  23. #define pb push_back
  24. int new_node(int x){++tot;t[tot].l=t[tot].r=;t[tot].v=x;t[tot].sz=t[tot].valid=;t[tot].del=;return tot;}
  25. bool Bad(int o){
  26. return (double)t[ls(o)].sz>alpha*t[o].sz||(double)t[rs(o)].sz>alpha*t[o].sz;
  27. }
  28. void Updata(int o){
  29. t[o].sz=t[ls(o)].sz+t[rs(o)].sz+;
  30. t[o].valid=t[ls(o)].valid+t[rs(o)].valid+!t[o].del;
  31. }
  32. void Dfs(int o,std::vector<int> &v){
  33. if(!o) return;
  34. Dfs(ls(o),v);
  35. if(!t[o].del) v.pb(o);
  36. Dfs(rs(o),v);
  37. }
  38. int Build(std::vector<int> &v,int l,int r){
  39. if(l>r) return ;//原因是右边界不包含
  40. int mid=(l+r)>>,o=v[mid];
  41. ls(o)=Build(v,l,mid-);
  42. rs(o)=Build(v,mid+,r);
  43. Updata(o);
  44. return o;
  45. }
  46. void ReBuild(int &o){
  47. std::vector<int>v;
  48. Dfs(o,v);
  49. o=Build(v,,(int)v.size()-);
  50. }
  51. void Insert(int x,int &o){
  52. if(!o){
  53. o=new_node(x);
  54. return ;
  55. }
  56. if(x>=t[o].v) Insert(x,rs(o));
  57. else Insert(x,ls(o));
  58. Updata(o);
  59. if(Bad(o)) ReBuild(o);
  60. return;
  61. }
  62. //del with rnk
  63. void Delete(int o,int Rnk){
  64. if(!t[o].del&&Rnk==t[ls(o)].valid+) {
  65. t[o].del=;
  66. --t[o].valid;
  67. return;
  68. }
  69. if(Rnk<=t[ls(o)].valid+!t[o].del) Delete(ls(o),Rnk);
  70. else Delete(rs(o),Rnk-t[ls(o)].valid-!t[o].del);
  71. Updata(o);
  72. }
  73. int GetRank(int o,int x){
  74. int ans=;
  75. while(o){
  76. if(t[o].v>=x) o=ls(o);
  77. else{
  78. ans+=t[ls(o)].valid+!t[o].del;
  79. o=rs(o);
  80. }
  81. }
  82. return ans;
  83. }
  84. int FindKth(int o,int x) {
  85. while(o){
  86. if(!t[o].del&&t[ls(o)].valid+==x) {return t[o].v;}
  87. if(t[ls(o)].valid>=x) o=ls(o);
  88. else {
  89. x-=t[ls(o)].valid+!t[o].del;
  90. o=rs(o);
  91. }
  92. }
  93. }
  94. int GetPred(int o,int x){
  95. return FindKth(o,GetRank(o,x)-);
  96. }
  97. int GetSucc(int o,int x){
  98. return FindKth(o,GetRank(o,x+));
  99. }
  100. }
  101. using namespace ScapegoatTree;
  102.  
  103. int main() {
  104. scanf("%d",&n);
  105. rt=;
  106. while(n--) {
  107. int op,x;
  108. scanf("%d%d",&op,&x);
  109. if(op==) Insert(x,rt);
  110. if(op==) Delete(rt,GetRank(rt,x));
  111. if(op==) printf("%d\n",GetRank(rt,x));
  112. if(op==) printf("%d\n",FindKth(rt,x));
  113. if(op==) printf("%d\n",GetPred(rt,x));
  114. if(op==) printf("%d\n",GetSucc(rt,x));
  115. }
  116. return ;
  117. }

[luogu3369]普通平衡树(替罪羊树模板)的更多相关文章

  1. [TYVJ1728/BZOJ3224]普通平衡树-替罪羊树

    Problem 普通平衡树 Solution 本题是裸的二叉平衡树.有很多种方法可以实现.这里打的是替罪羊树模板. 此题极其恶心. 前驱后继模块需要利用到rank模块来换一种思路求. 很多细节的地方容 ...

  2. Luogu 3369 / BZOJ 3224 - 普通平衡树 - [替罪羊树]

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...

  3. 平衡树 替罪羊树(Scapegoat Tree)

    替罪羊树(Scapegoat Tree) 入门模板题 洛谷oj P3369 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入xx数 删除xx数(若有多个相同 ...

  4. bzoj2827: 千山鸟飞绝 平衡树 替罪羊树 蜜汁标记

    这道题首先可以看出坐标没有什么意义离散掉就好了. 然后你就会发现你要每次都更改坐标,而一旦更改受影响的是坐标里的所有数,要是一个一个的改,会不可描述. 所以换个视角,我们要找的是某只鸟所到每个坐标时遇 ...

  5. bzoj 3224: Tyvj 1728 普通平衡树 替罪羊树

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

  6. BZOJ 3224: Tyvj 1728 普通平衡树 or 洛谷 P3369 【模板】普通平衡树-Splay树模板题

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 22483  Solved: 10130[Submit][S ...

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

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

  8. 替罪羊树模板(BZOJ1056/1862)

    #include<cstdio> #include<cstring> #include<cmath> #include<iostream> #defin ...

  9. [luogu3369] 普通平衡树(splay模板)

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

随机推荐

  1. Mongodb 的劣势

    MongoDB中的数据存放具有相当的随意性,不具有MySQL在开始就定义好了.对运维人员来说,他们可能不清楚数据库内部数据的数据格式,这也会数据库的运维带来了麻烦. 1. 事务关系支持薄弱.这也是所有 ...

  2. for-in 的坑

    for-in 循环的下标为字符串,不是数字 var ar=[13,2,13,14]; function isSort(ar){ for(var i in ar){ console.log(i+':'+ ...

  3. 第一章 Linux系统入门

    设定目标,寻求方法,勤奋努力,坚持不懈. ------你们知道了,而我们做到了.------ 世界上第一台计算机:ENIAC(埃尼亚克).1946-2 宾夕法尼亚大学. 约翰·冯·诺依曼体系 电脑的组 ...

  4. 使用Hydra通过ssh破解密码

    Hydra是非常高效的网络登录破解工具,它可以对多种服务程序执行暴力破解(SSH.VNC等等). 防止这种攻击其实很容易,方法很多.以SSH为例: Ubuntu:使用Port Knocking隐藏SS ...

  5. Block Towers (思维实现)

    个人心得:这题没怎么看,题意难懂.后面比完再看的时候发现很好做但是怎么卡时间是个问题. 题意:就是有m个可以用2层积木的,n个可以用三层积木的,但是他们不允许重复所以可以无限添加. 比如 3 2 一开 ...

  6. 【转】IUSR和IIS_IUSRS

    转自:http://blog.chinaunix.net/uid-20344928-id-3306130.html   概述   在早期的IIS版本中,随着IIS的安装,系统会创建一个IUSR_Mac ...

  7. lvds配置

    基于Altera FPGA的LVDS配置应用一例 在特权同学发表博文<Cyclone III的LVDS接口注意事项>后,不少网友发邮件询问LVDS具体应用的一些问题.这些网友,归根到底,估 ...

  8. oracle系统表的查询

    oracle查询用户下的所有表 select * from all_tab_comments -- 查询所有用户的表,视图等select * from user_tab_comments   -- 查 ...

  9. C# 实现程序只启动一次(实现程序自重启)

    程序运行过程中,不能有多个实例运行,并且需要程序自己可以重启(重新运行),所以代码如果下代码: static void Main() { bool createNew; using (System.T ...

  10. windows下安装storm1.1.0并启动

    64位windows安装storm前需要先搞定zookeeper和python,所以下面我们3步走: 一.zookeeper 1.上https://zookeeper.apache.org/点击下方d ...