平衡树板题

原题传送门

这道题要用Splay,我博客里有对Splay的详细介绍

每次加入一个数,把数插入平衡树中

并且要记录一共有多少个数

每次查询就查询平衡树中第(总数-1)/2+1个数

十分暴力

  1. #include <bits/stdc++.h>
  2. #define N 110005
  3. #define root tree[0].ch[1]
  4. using namespace std;
  5. inline int read()
  6. {
  7. register int x=0,f=1;register char ch=getchar();
  8. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  9. while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
  10. return x*f;
  11. }
  12. inline void write(register int x)
  13. {
  14. if(!x)putchar('0');if(x<0)x=-x,putchar('-');
  15. static int sta[36];int tot=0;
  16. while(x)sta[tot++]=x%10,x/=10;
  17. while(tot)putchar(sta[--tot]+48);
  18. }
  19. struct splay{
  20. int v,fa,ch[2],rec,sum;
  21. }tree[N];
  22. int tot=0;
  23. inline bool findd(register int x)
  24. {
  25. return x==tree[tree[x].fa].ch[0]?0:1;
  26. }
  27. inline void connect(register int x,register int fa,register int son)
  28. {
  29. tree[x].fa=fa;
  30. tree[fa].ch[son]=x;
  31. }
  32. inline void update(register int x)
  33. {
  34. tree[x].sum=tree[tree[x].ch[0]].sum+tree[tree[x].ch[1]].sum+tree[x].rec;
  35. }
  36. inline void rotate(register int x)
  37. {
  38. int Y=tree[x].fa;
  39. int R=tree[Y].fa;
  40. int Yson=findd(x);
  41. int Rson=findd(Y);
  42. int B=tree[x].ch[Yson^1];
  43. connect(B,Y,Yson);
  44. connect(Y,x,Yson^1);
  45. connect(x,R,Rson);
  46. update(Y),update(x);
  47. }
  48. inline void splay(register int x,register int to)
  49. {
  50. to=tree[to].fa;
  51. while(tree[x].fa!=to)
  52. {
  53. int y=tree[x].fa;
  54. if(tree[y].fa==to)
  55. rotate(x);
  56. else if(findd(x)==findd(y))
  57. rotate(y),rotate(x);
  58. else
  59. rotate(x),rotate(x);
  60. }
  61. }
  62. inline int newpoint(register int v,register int fa)
  63. {
  64. tree[++tot].v=v;
  65. tree[tot].fa=fa;
  66. tree[tot].sum=tree[tot].rec=1;
  67. return tot;
  68. }
  69. inline void Insert(register int x)
  70. {
  71. int now=root;
  72. if(root==0)
  73. {
  74. newpoint(x,0);
  75. root=tot;
  76. }
  77. else
  78. {
  79. while(19260817)
  80. {
  81. ++tree[now].sum;
  82. if(x==tree[now].v)
  83. {
  84. ++tree[now].rec;
  85. splay(now,root);
  86. return;
  87. }
  88. int nxt=x<tree[now].v?0:1;
  89. if(!tree[now].ch[nxt])
  90. {
  91. int p=newpoint(x,now);
  92. tree[now].ch[nxt]=p;
  93. splay(p,root);
  94. return;
  95. }
  96. now=tree[now].ch[nxt];
  97. }
  98. }
  99. }
  100. inline int arank(register int x)
  101. {
  102. int now=root;
  103. while(19260817)
  104. {
  105. int used=tree[now].sum-tree[tree[now].ch[1]].sum;
  106. if(x>tree[tree[now].ch[0]].sum&&x<=used)
  107. {
  108. splay(now,root);
  109. return tree[now].v;
  110. }
  111. if(x<used)
  112. now=tree[now].ch[0];
  113. else
  114. x-=used,now=tree[now].ch[1];
  115. }
  116. }
  117. int main()
  118. {
  119. int n=read();
  120. int sum=0;
  121. for(register int i=1;i<=n;++i)
  122. {
  123. int x=read();
  124. Insert(x);
  125. ++sum;
  126. }
  127. int m=read();
  128. while(m--)
  129. {
  130. char ch=getchar();
  131. while(ch!='a'&&ch!='m')
  132. ch=getchar();
  133. if(ch=='a')
  134. {
  135. int x=read();
  136. Insert(x);
  137. ++sum;
  138. }
  139. else if(ch=='m')
  140. {
  141. write(arank((sum-1)/2+1));
  142. printf("\n");
  143. }
  144. }
  145. return 0;
  146. }

【题解】Luogu P3871 [TJOI2010]中位数的更多相关文章

  1. [LUOGU] P3871 [TJOI2010]中位数

    题目描述 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前序列的中位数 中位数是指将一个序列按照从 ...

  2. 洛谷 P3871 [TJOI2010]中位数 解题报告

    P3871 [TJOI2010]中位数 题目描述 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前 ...

  3. 洛谷——P3871 [TJOI2010]中位数

    P3871 [TJOI2010]中位数 一眼秒掉,这不是splay水题吗,套模板 #include<bits/stdc++.h> #define IL inline #define N 1 ...

  4. 洛谷P3871 [TJOI2010]中位数(splay)

    题目描述 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前序列的中位数 中位数是指将一个序列按照从 ...

  5. P3871 [TJOI2010]中位数

    傻逼题 维护两个系统堆即可 #include<bits/stdc++.h> #define il inline #define vd void typedef long long ll; ...

  6. luoguP3871 [TJOI2010]中位数

    题目链接 luoguP3871 [TJOI2010]中位数 题解 平衡树 代码 #include<vector> #include<cstdio> #include<cs ...

  7. [题解] Luogu P5446 [THUPC2018]绿绿和串串

    [题解] Luogu P5446 [THUPC2018]绿绿和串串 ·题目大意 定义一个翻转操作\(f(S_n)\),表示对于一个字符串\(S_n\), 有\(f(S)= \{S_1,S_2,..., ...

  8. 题解 P3871 【[TJOI2010]中位数】

    orz各位大佬,题解太强了,主席树,堆,线段树,splay,还有暴力,太巨了.所以我用的是fhq treap(好像更高级).算了. 反正都是平衡树,这道题就是动态求中位数,不会做的同学可以先做弱化版P ...

  9. 洛谷 题解 P3871 【[TJOI2010]中位数】

    这题先定义一个大根堆(maxn)维护mid(n为奇数mid+1)的元素.再定义一个小根堆(minn)维护mid(n为奇数mid+1)到n的元素.然后对于插入元素的情况进行分类讨论. 当add x时 一 ...

随机推荐

  1. css3--之HSL颜色

    jQuery之家: CSS3中使用的HSL颜色指南:http://www.htmleaf.com/ziliaoku/qianduanjiaocheng/201503281590.html 要理解HSL ...

  2. 准备spring

    下载对应版本:http://repo.spring.io/libs-release-local/org/springframework/spring/ Spring下载:https://spring. ...

  3. Python scrapy - Login Authenication Issue

    https://stackoverflow.com/questions/37841409/python-scrapy-login-authenication-issue from scrapy.cra ...

  4. turtle库基础练习

    1.画一组同切圆 import turtle turtle.circle(10) turtle.circle(20) turtle.circle(30) turtle.circle(40) turtl ...

  5. 用python进行wifi密码生成

    随着无线网络的不断发展,几乎所有场合都会覆盖WIFI信号,无论是公共地点还是家庭之中.众所周知,目前WIFI普遍的认证方式为wpa2,这种认证方式安全性相当不错,但由于人们设置密码时的随意性和固有思维 ...

  6. Spring源码阅读(四)

    我们知道,在spring bean生命周期中,我们可以在不同阶段执行处理器或者方法,比如init-method,destroy方法,BeanPostProcessor接口等.那么这些处理器或方法的执行 ...

  7. redis常见应用场景

    redis应用场景总结redis平时我们用到的地方蛮多的,下面就了解的应用场景做个总结: 1.热点数据的缓存 由于redis访问速度块.支持的数据类型比较丰富,所以redis很适合用来存储热点数据,另 ...

  8. 32个使用python代码片段

    1.冒泡排序 lis = [56,12,1,8,354,10,100,34,56,7,23,456,234,-58] def sortport():    for i in range(len(lis ...

  9. ATM取款机

    package Tests; import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;impo ...

  10. Linux基础命令---ifconfig

    ifconfig ifconfig指令用来配置网络接口参数,同时还可以显示当前内核网络接口的工作状态.如果没有提供参数,则ifconfig将显示当前活动接口的状态.如果给定单个接口参数,则只显示给定接 ...