题目链接

luoguP3871 [TJOI2010]中位数

题解

平衡树

代码

  1. #include<vector>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define LL long long
  6. inline int read() {
  7. int x = 0,f = 1;char c = getchar();
  8. while(c < '0'||c > '9'){if(c == '-')f = -1;c = getchar();}
  9. while(c <= '9' &&c >= '0')x = x * 10 + c - '0',c = getchar();
  10. return x * f;
  11. }
  12. #define root ch[0][1]
  13. const int maxn = 1000007;
  14. int n,a[maxn],Num = 0,val[maxn],fa[maxn],siz[maxn],ch[maxn][2],num[maxn];
  15. inline int ident(int x) { return x == ch[fa[x]][0] ? 0 : 1; }
  16. inline void connect(int x,int y,int which) {fa[x] = y,ch[fa[x]][which] = x;}
  17. inline void update(int x) {
  18. siz[x] = siz[ch[x][1]] + siz[ch[x][0]] + num[x];
  19. }
  20. void rotate(int x) {
  21. int y = fa[x],z = fa[y];
  22. int yson = ident(x),zson = ident(y);
  23. int ixson = ch[x][yson ^ 1];
  24. connect(ixson,y,yson);
  25. connect(x,z,zson);
  26. connect(y,x,yson ^ 1);
  27. update(y); update(x);
  28. }
  29. void splay(int x,int to) {
  30. to = fa[to] ;
  31. while(fa[x] != to) {
  32. int y = fa[x];
  33. if(fa[y] == to) rotate(x);
  34. else if(ident(x) == ident(y)) rotate(y),rotate(x);
  35. else rotate(x),rotate(x);
  36. //rotate(x);
  37. }
  38. }
  39. int newnode(int Fa,int x) {
  40. val[++ Num] = x;
  41. fa[Num] = Fa;
  42. num[Num] = siz[Num] = 1; return Num;
  43. }
  44. void insert(int x) {
  45. if(!root) {root = newnode(0,x);return ;}
  46. int now = root;
  47. while(now ) {
  48. siz[now] ++;
  49. if(val[now] == x) {num[now] ++ ;return;}
  50. int nxt = val[now] < x ? 1 : 0;
  51. if(!ch[now][nxt] ){ch[now][nxt] = newnode(now,x); splay(ch[now][nxt],root);return;}
  52. now = ch[now][nxt];
  53. }
  54. }
  55. int Arank(int x) {
  56. int now = root;
  57. while(now) {
  58. int used = siz[now] - siz[ch[now][1]];
  59. if(x > siz[ch[now][0]] && x <= used) return val[now];
  60. if(used < x) x -= used,now = ch[now][1];
  61. else now = ch[now][0];
  62. }
  63. }
  64. int main() {
  65. n = read();
  66. for(int i = 1;i <= n;++ i) insert(read());
  67. int q = read();
  68. char op[10];
  69. for(int i = 1;i <= q;++ i) {
  70. scanf("%s",op + 1);
  71. if(op[1] == 'a') {
  72. insert(read()); n ++;
  73. } else {
  74. printf("%d\n",Arank(n / 2 + (n & 1)) );
  75. }
  76. }
  77. return 0;
  78. }

luoguP3871 [TJOI2010]中位数的更多相关文章

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

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

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

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

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

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

  4. TJOI2010中位数

    中位数 上面是题目链接. 这一题比较水. 思路非常显然. 用mid查询时,只要返回中间值就行了. 主要就是add操作. 我们肯定不能插在末尾,然后用系统快排,这样只有30分. 那么正确的操作应该是二分 ...

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

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

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

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

  7. 洛谷 3871 [TJOI2010]中位数

    [题解] 平衡树模板题,不过因为可以离线,所以有别的做法.把询问倒着做,变成删掉数字.求中位数,于是可以二分+树状数组. #include<cstdio> #include<cstr ...

  8. [TJOI2010]中位数

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

  9. 洛谷3871 [TJOI2010]中位数 维护队列的中位数

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

随机推荐

  1. 51、多线程创建的三种方式之实现Callable接口

    实现Callable接口创建线程 Callable接口是在jdk5版本中加入的,这个接口在java.util.concurrent包下面,与其他两种方式不同的地方在于使用Callable接口创建的线程 ...

  2. TCP三次握手与四次挥手过程

    TCP连接的建立(三次握手) 首先,客户端与服务器均处于未连接状态,并且是客户端主动向服务器请求建立连接: 客户端将报文段中的SYN=1(同步位),并选择一个seq=x,(即该请求报文的序号为x)  ...

  3. 【Eclipse】eclipse生成类图、类交互图、包依赖图

    今天,在修改毕设论文的时候需要画类图,系统已经开发完成,如果手动拿PowerDesigner画类图太浪费时间,于是通过网上查阅资料发现eclipse可以集成一个插件生成类图,也可以生成包图.现在做记录 ...

  4. libevent简介和使用【转】

    转自:http://www.open-open.com/lib/view/open1386510630330.html libevent是一个基于事件触发的网络库,memcached底层也是使用lib ...

  5. 安装Visual Studio Scrum 1.0过程模板

    近几年里,Scrum变成了相当流行的软件开发方法学.因为它轻量.可迭代且快速等优点,以致于在敏捷开发中极受欢迎.微软甚至将TFS2010自带的MSF Agile5.0过程模板做得像Scrum,开发者们 ...

  6. 使用gradle编译安卓APK

    一.安装JDK 在安装Gradle之前需要先安装JDK,由于安装的是Gradle是4.4所以需要安装JDK1.8. 之前编译总是提示如下错误就是由于先安装的jdk1.7然后安装的1.8造成的,在Gra ...

  7. 洛谷P3366最小生成树

    传送门啦 #include <iostream> #include <cstdio> #include <cstring> #include <algorit ...

  8. 洛谷P1725 琪露诺

    传送门啦 本人第一个单调队列优化 $ dp $,不鼓励鼓励? 琪露诺这个题,$ dp $ 还是挺好想的对不,但是暴力 $ dp $ 的话会 $ TLE $ ,所以我们考虑用单调队列优化. 原题中说她只 ...

  9. 2016-2017-2 20155309南皓芯《java程序设计》第十周学习总结

    教材内容总结 网络编程 定义:网络编程就是在两个或两个以上的设备之间传输数据. 计算机网络概述: 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输. 网络中的每个设备都会有一个唯一的数 ...

  10. JDBC连接池和DBUtils

    本节内容: JDBC连接池 DBUtils 一.JDBC连接池 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采取连接池技术,来共享连接Conne ...