题目链接

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. IE安全系列之——RES Protocol

    IE安全系列之--RES Protocol res Protocol用于从一个文件里面提取指定资源.语法为:res://sFile[/sType]/sID 各Token含义: sfile:百分号编码. ...

  2. ORA-00906 missing left parenthesis括号

    Oracle 建表报错:ORA-00906 missing left parenthesis括号    建表语句:create table test(id char,name varchar(1),s ...

  3. 【比赛游记】NOIWC2019冬眠记

    上接THUWC2019酱油记. 贴一点文艺汇演的精彩表演: https://www.bilibili.com/video/av42089198/ https://www.bilibili.com/vi ...

  4. C# Java 加密解密

    C# AES加密解密 public static string Encrypt(string key, string clearText) { byte[] clearBytes = Encoding ...

  5. Android页面之间进行数据回传

    要求:页面1跳转到页面2,页面2再返回页面1同时返回数据 页面1添加如下代码: Intent intent = new Intent(); intent.setClass(页面1.this, 页面2. ...

  6. jQuery之字体大小的设置

    先获取字体大小,进行处理. 再将修改的值保存. slice() 方法可从已有的数组中返回选定的元素.arrayObject.slice(start,end).start     必需.规定从何处开始选 ...

  7. HTML网页自动跳转

    <meta http-equiv="refresh" content="3;URL=res.html">

  8. Tomcat底层实现

    package myserver; import java.io.IOException;import java.net.ServerSocket;import java.net.Socket; pu ...

  9. Shell学习笔记:#*、%*字符串掐头去尾方法

    一.语法 在shell中可以通过#.%对字符串进行掐头去尾操作,使用方法如下: # 表示掐头 % 表示去尾 单个#或%表示最小匹配 双个$或%表示最大匹配  二.例子1 假设我们定义一个变量为: fi ...

  10. gtk+学习笔记(八)

    框架(Frames)可以用于在盒子中封装一个或一组构件,框架本身还可以有一个标签.标签的位置和盒子的风格可以灵活改变. 框架可以用下面的函数创建: GtkWidget *gtk_frame_new( ...