冬令营被平衡树坑了之后,打算苦练一番数据结构(QAQ)。

先是打了一下想学好久的替罪羊树。

替罪羊树实现方法很简单,就是在不满足平衡条件的时候暴力重构子树。

调试小结:

  1.删除操作分两类情况:如果某点只有一个孩子,将它的孩子提上来即可,否则将它变为它的前驱,再删去它的前驱。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. const double a=0.75;
  7. inline int getnum()
  8. {
  9. int ans=,fh=;char ch=getchar();
  10. while(ch<''||ch>''){if(ch=='-')fh*=-;ch=getchar();}
  11. while(ch>=''&&ch<='')ans=ans*+ch-'',ch=getchar();
  12. return fh*ans;
  13. }
  14. struct node{int s[],f,size,num;}t[];int tnum,root;
  15. inline void init()
  16. {
  17. tnum=;root=;
  18. t[].num=-;t[].size=;t[].s[]=;
  19. t[].num=;t[].size=;t[].f=;
  20. }
  21. inline bool balance(int po)
  22. {
  23. return (double)t[po].size*a>=(double)t[t[po].s[]].size
  24. &&(double)t[po].size*a>=(double)t[t[po].s[]].size;
  25. }
  26. int E[],esize;
  27. void travel(int po)
  28. {
  29. if(t[po].s[])travel(t[po].s[]);
  30. E[++esize]=po;
  31. if(t[po].s[])travel(t[po].s[]);
  32. }
  33. int build(int l,int r)
  34. {
  35. if(l>r)return ;
  36. int mid=(l+r)/,po=E[mid];
  37. t[t[po].s[]=build(l,mid-)].f=po;
  38. t[t[po].s[]=build(mid+,r)].f=po;
  39. t[po].size=t[t[po].s[]].size+t[t[po].s[]].size+;
  40. return po;
  41. }
  42. inline void rebuild(int po)
  43. {
  44. esize=;travel(po);
  45. int fa=t[po].f,ws=(t[t[po].f].s[]==po);
  46. int npo=build(,esize);
  47. t[t[fa].s[ws]=npo].f=fa;
  48. if(po==root)root=npo;
  49. }
  50. inline void insert(int num)
  51. {
  52. int now=root,npo=++tnum;
  53. t[npo].size=;t[npo].num=num;
  54. while(true)
  55. {
  56. t[now].size++;
  57. bool ws=(num>=t[now].num);
  58. if(t[now].s[ws])now=t[now].s[ws];
  59. else {t[t[now].s[ws]=npo].f=now;break ;}
  60. }
  61. int inv=;
  62. for(int i=npo;i;i=t[i].f)if(!balance(i))inv=i;
  63. if(inv)rebuild(inv);
  64. }
  65. inline int rank(int num)
  66. {
  67. int now=root,ans=;
  68. while(now)
  69. {
  70. if(t[now].num<num)ans+=t[t[now].s[]].size+,now=t[now].s[];
  71. else now=t[now].s[];
  72. }
  73. return ans;
  74. }
  75. inline int getkth(int kth)
  76. {
  77. int now=root;
  78. while(true)
  79. {
  80. if(t[t[now].s[]].size==kth-)return now;
  81. else if(t[t[now].s[]].size>=kth)now=t[now].s[];
  82. else kth-=t[t[now].s[]].size+,now=t[now].s[];
  83. }
  84. return now;
  85. }
  86. inline int getn(int num)
  87. {
  88. int now=root;
  89. while(true)
  90. {
  91. if(t[now].num==num)return now;
  92. else now=t[now].s[t[now].num<num];
  93. }
  94. }
  95. inline void erase(int po)
  96. {
  97. if(t[po].s[]&&t[po].s[])
  98. {
  99. int tpo=t[po].s[];
  100. while(t[tpo].s[])tpo=t[tpo].s[];
  101. t[po].num=t[tpo].num;
  102. po=tpo;
  103. }
  104. int son=(t[po].s[])?t[po].s[]:t[po].s[],ws=(t[t[po].f].s[]==po);
  105. t[t[t[po].f].s[ws]=son].f=t[po].f;
  106. for(int i=t[po].f;i;i=t[i].f)t[i].size--;
  107. if(po==root)root=son;
  108. }
  109. inline int succ(int num)
  110. {
  111. int now=root,ans=;
  112. while(now)
  113. {
  114. if(t[now].num>num)ans=min(ans,t[now].num),now=t[now].s[];
  115. else now=t[now].s[];
  116. }
  117. return ans;
  118. }
  119. inline int pred(int num)
  120. {
  121. int now=root,ans=-;
  122. while(now)
  123. {
  124. if(t[now].num<num)ans=max(ans,t[now].num),now=t[now].s[];
  125. else now=t[now].s[];
  126. }
  127. return ans;
  128. }
  129. int main(int argc, char *argv[])
  130. {
  131. init();
  132. int n=getnum();
  133. for(int i=;i<=n;i++)
  134. {
  135. int p=getnum(),num=getnum();
  136. if(p==)insert(num);
  137. if(p==)erase(getn(num));
  138. if(p==)printf("%d\n",rank(num));
  139. if(p==)printf("%d\n",t[getkth(num+)].num);
  140. if(p==)printf("%d\n",pred(num));
  141. if(p==)printf("%d\n",succ(num));
  142. }
  143. return ;
  144. }

替罪羊树—BZOJ3224: Tyvj 1728 普通平衡树的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. BZOJ3224 Tyvj 1728 普通平衡树(Treap)

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

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

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

  8. 绝对是全网最好的Splay 入门详解——洛谷P3369&BZOJ3224: Tyvj 1728 普通平衡树 包教包会

    平衡树是什么东西想必我就不用说太多了吧. 百度百科: 一个月之前的某天晚上,yuli巨佬为我们初步讲解了Splay,当时接触到了平衡树里的旋转等各种骚操作,感觉非常厉害.而第二天我调Splay的模板竟 ...

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

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

随机推荐

  1. Linq---左外联查询

    花了好半天才解决这个问题,终于在网上找到了答案,在此记录备份. 参考连接:http://bbs.csdn.net/topics/390150047 自己总结的如下: 结构就不说了,最后大家自己下源码看 ...

  2. JSON.NET 简单的使用

    JSON.NET(http://json.codeplex.com/)使用来将.NET中的对象转换为JSON字符串(序列化?),或者将JSON字符串转换为.NET中已有类型的对象(反序列化?) 首先为 ...

  3. JS中对象与字符串的互相转换

    在使用 JSON2.JS 文件的 JSON.parse(data) 方法时候,碰到了问题: throw new SyntaxError('JSON.parse'); 查询资料,大概意思如下: JSON ...

  4. Kettle_设置变量的两种方法

    一个复杂的kettle作业一般包括很多子作业和转换,在主作业Start后通常会添加一个[设置变量]的流程,该流程的功能是为所有流程的公共变量设置通用值.       主作业添加的[设置变量]针对的是所 ...

  5. maven加载spring包

    <dependencies> <dependency> <groupId>org.springframework</groupId> <artif ...

  6. C#图片读取和保存

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  7. iOS 开发之内购 – AppStore

    前言本文会给大家详细介绍iOS内购,虽然之前网上也有内购的教程,但是还不够详细,我重新整理出一份教程,希望对大家有所帮助.    基于Xcode7.1.1版本,模拟器iphone6,9.1系统.    ...

  8. codeforce 626E(二分)

    E. Simple Skewness time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

  9. POJ 1789Truck History(pirme)

    Truck History Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 22648   Accepted: 8781 De ...

  10. strstr()

    char * __cdecl strstr ( const char * str1, const char * str2 ) { char *cp = (char *) str1; char *s1, ...