题目描述
给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前序列的中位数 中位数是指将一个序列按照从小到大排序后处在中间位置的数。(若序列长度为偶数,则指处在中间位置的两个数中较小的那个) 例1:1 2 13 14 15 16 中位数为13 例2:1 3 5 7 10 11 17 中位数为7 例3:1 1 1 2 3 中位数为1 输入输出格式
输入格式:
第一行为初始序列长度N。第二行为N个整数,表示整数序列,数字之间用空格分隔。第三行为操作数M,即要进行M次操作。下面为M行,每行输入格式如题意所述。 输出格式:
对于每个mid操作输出中位数的值 输入输出样例
输入样例#1:
6
1 2 13 14 15 16
5
add 5
add 3
mid
add 20
mid
输出样例#1:
5
13
说明
对于30%的数据,1 ≤ N ≤ 10,000,0 ≤ M ≤ 1,000 对于100%的数据,1 ≤ N ≤ 100,000,0 ≤ M ≤ 10,000 序列中整数的绝对值不超过1,000,000,000,序列中的数可能有重复 每个测试点时限1秒

Splay,kth

#include<iostream>
#include<cstdio> using namespace std; inline int rd() {
int ret=0,f=1;
char c;
while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;
while(isdigit(c))ret=ret*10+c-'0',c=getchar();
return ret*f;
} const int MAXN=1000005; int num;
int val[MAXN],cnt[MAXN],siz[MAXN];
int ch[MAXN][2],fa[MAXN];
int root,tot;
inline int newnode(int x){num++;val[++tot]=x;cnt[tot]=siz[tot]=1;return tot;}
inline bool check(int x){return x==ch[fa[x]][1];}
inline void pushup(int x){siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+cnt[x];}
void rotate(int x){
int y=fa[x],z=fa[fa[x]];
bool ck=check(x);
fa[ch[x][ck^1]]=y;ch[y][ck]=ch[x][ck^1];
ch[x][ck^1]=y;fa[y]=x;fa[x]=z;
if(z) ch[z][ch[z][1]==y]=x;
pushup(y);pushup(x);
}
void splay(int x){
for(int f=fa[x];f;rotate(x),f=fa[x])
if(fa[f]) rotate(check(x)==check(f)?f:x);
root=x;
}
void insert(int x){
if(!root){root=newnode(x);return;}
int cur=root,f=0;
while(1){
if(val[cur]==x){num++;cnt[cur]++;pushup(cur);pushup(f);splay(cur);return;}
f=cur;cur=ch[cur][x>val[cur]];
if(!cur){cur=newnode(x);fa[cur]=f;ch[f][x>val[f]]=cur;pushup(f);splay(cur);return;}
}
}
int kth(int x){
int cur=root;
while(1){
if(x<=siz[ch[cur][0]]) cur=ch[cur][0];
else{
x-=siz[ch[cur][0]]+cnt[cur];
if(x<=0) return val[cur];
cur=ch[cur][1];
}
}
} int n,m; int main(){
n=rd();
for(int i=1;i<=n;i++) insert(rd());
m=rd();
char s[10];
for(int i=1;i<=m;i++){
scanf("%s",s);
if(s[0]=='a') insert(rd());
else printf("%d\n",kth((num+1)/2));
}
return 0;
}

最新文章

  1. Script component 用法
  2. MySql联接算法
  3. 【MySQL】分页优化
  4. MAC 卸载 openfire
  5. 实现仿知乎的开场动画,图片zoomin的效果,实现原理,没加动效
  6. unity, monoDevelop ide 代码提示不起作用的解决方法
  7. Ztack学习笔记(3)-系统启动分析
  8. java.net.ServerSocket和java.net.Socket
  9. php mysql_insert_id() 获取为空
  10. 我的小前端 (2)—— JQ和zepto
  11. css 设置 checkbox复选框控件的对勾√样式
  12. Laravel的unique和exists验证规则的优化
  13. Assets Library开发总结
  14. JS_高阶函数(sort)
  15. CentOS 7 使用OwnCloud建立私有云储存网盘
  16. Oracle 将一个查询结果值动态赋值给一个变量
  17. ALSA学习资料
  18. Wilcoxon-Mann-Whitney rank sum test
  19. libgdx学习记录25——Rectangle与Circle是否重叠
  20. UML图中聚合、组合、关联、依赖、泛化的强弱关系

热门文章

  1. Codeforces34C【尺取】
  2. Codeforces 378C
  3. Cg(C for Graphic)语言表达式与控制语句(转)
  4. P4692 [Ynoi2016]谁的梦
  5. Python入门小练习 002 批量下载网页链接中的图片
  6. 转 Oracle中merge into的使用
  7. 513 Find Bottom Left Tree Value 找树左下角的值
  8. 第一章、 CLR的执行模型
  9. idea DeBug调试学习
  10. AJPFX总结java开发常用类(包装,数字处理集合等)(一)