洛谷P3871 [TJOI2010]中位数(splay)
题目描述
给定一个由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操作输出中位数的值
输入输出样例
说明
对于30%的数据,1 ≤ N ≤ 10,000,0 ≤ M ≤ 1,000
对于100%的数据,1 ≤ N ≤ 100,000,0 ≤ M ≤ 10,000
序列中整数的绝对值不超过1,000,000,000,序列中的数可能有重复
每个测试点时限1秒
这题不是随便做么。。
口胡一下我能想到的做法吧,,
1.$M < 10000$的话vector暴力插入不知道能不能A,
2.直接用平衡树,我写的是splay,不想写代码的话可以用pb_ds里维护了siz域的红黑树
3.先离线,对权值离散化,然后用权值线段树查。
4.沿用https://www.luogu.org/problemnew/show/P1801这道题的做法
#include<cstdio>
using namespace std;
const int MAXN = 1e6 + ;
#define ls(x) ch[x][0]
#define rs(x) ch[x][1]
#define root ch[0][1]
int fa[MAXN], val[MAXN], rev[MAXN], siz[MAXN], ch[MAXN][], tot = ;
bool ident(int x) {
return ch[fa[x]][] == x ? : ;
}
void connect(int x, int _fa, int opt) {
fa[x] = _fa, ch[fa[x]][opt] = x;
}
void update(int x) {
siz[x] = siz[ls(x)] + siz[rs(x)] + rev[x];
}
void rotate(int x) {
int Y = fa[x], R = fa[Y];
int Yson = ident(x), Rson = ident(Y);
int B = ch[x][Yson ^ ];
connect(B, Y, Yson);
connect(x, R, Rson);
connect(Y, x, Yson ^ );
//tag
update(Y); update(x);
}
void splay(int x, int to) {
to = fa[to];
while(fa[x] != to) {
int y = fa[x];
if(fa[y] == to) rotate(x);
else if(ident(x) == ident(y)) rotate(y), rotate(x);
else rotate(x), rotate(x);
}
}
int NewNode(int _fa, int _val) {
val[++tot] = _val;
fa[tot] = _fa;
siz[tot] = rev[tot] = ;
return tot;
}
void insert(int x) {
if(!root) {root = NewNode(, x); return ;}
int now = root;
while(now) {
siz[now]++;
if(val[now] == x) {rev[now]++; return ;}
int nxt = val[now] < x;
if(!ch[now][nxt]) {ch[now][nxt] = NewNode(now, x); splay(ch[now][nxt], root); return ;}
now = ch[now][nxt];
}
}
int ARank(int x) {
int now = root;
while(now) {
//if(siz[now] == x) return val[now];
int used = siz[now] - siz[rs(now)];
if(x > siz[ls(now)] && x <= used) return val[now];
if(used < x) x = x - used, now = ch[now][];
else now = ch[now][];
}
}
char opt[];
int main() {
#ifdef WIN32
freopen("a.in", "r", stdin);
#endif
int N;
scanf("%d", &N);
for(int i = ; i <= N; i++) {
int x; scanf("%d", &x);
insert(x);
}
int Q;
scanf("%d", &Q);
while(Q--) {
scanf("%s", opt + );
if(opt[] == 'a') {
int x;
scanf("%d", &x);
insert(x); N++;
}
else
printf("%d\n", ARank(N / + (N & )));
}
return ;
}
洛谷P3871 [TJOI2010]中位数(splay)的更多相关文章
- 洛谷——P3871 [TJOI2010]中位数
P3871 [TJOI2010]中位数 一眼秒掉,这不是splay水题吗,套模板 #include<bits/stdc++.h> #define IL inline #define N 1 ...
- 洛谷 P3871 [TJOI2010]中位数 解题报告
P3871 [TJOI2010]中位数 题目描述 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前 ...
- 洛谷 3871 [TJOI2010]中位数
[题解] 平衡树模板题,不过因为可以离线,所以有别的做法.把询问倒着做,变成删掉数字.求中位数,于是可以二分+树状数组. #include<cstdio> #include<cstr ...
- 洛谷3871 [TJOI2010]中位数 维护队列的中位数
题目描述 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前序列的中位数 中位数是指将一个序列按照从 ...
- BZOJ3224/洛谷P3391 - 普通平衡树(Splay)
BZOJ链接 洛谷链接 题意简述 模板题啦~ 代码 //普通平衡树(Splay) #include <cstdio> int const N=1e5+10; int rt,ndCnt; i ...
- [洛谷P3391] 文艺平衡树 (Splay模板)
初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...
- 洛谷 P3871 中位数
->题目链接 题解: 暴力 经鉴定,此题数据水到没朋友. #include<algorithm> #include<iostream> #include<cstdi ...
- [LUOGU] P3871 [TJOI2010]中位数
题目描述 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前序列的中位数 中位数是指将一个序列按照从 ...
- 洛谷 P1627 [CQOI2009]中位数 解题报告
P1627 [CQOI2009]中位数 题目描述 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. 输入输出格式 输入格式 ...
随机推荐
- poj 1655 树的重心 && define注意事项
http://blog.csdn.net/acdreamers/article/details/16905653 题意:给定一棵树,求树的重心的编号以及重心删除后得到的最大子树的节点个数size,如果 ...
- Cannot execute request on any known server
1.com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: c ...
- git rebase 和 git merge 总结
git merge 和 git rebase 都是用于合并分支,但二者是存在区别的. 在使用时,记住以下两点: 当你从 remote 去 pull 的时候,永远使用 rebase(除了一个例外) 当你 ...
- 从零开始的全栈工程师——html篇1.4
背景与边框 一.背景(backgound) 1.背景颜色:background-color:red;(简写:background:color;) 备注:ie9以下给body设置background-c ...
- 高效的jQuery代码编写技巧
缓存变量 DOM遍历是昂贵的,所以尽量将会重用的元素缓存. // 糟糕 h = $('#element').height(); $(); // 建议 $element = $('#element'); ...
- ie浏览器 vuejs axios Promise 未定义
随着前端技术的发现,es6语法在被更大范围的使用,而很多的浏览器并不支持ES6,比如IE…… 这里我们介绍几个解决方法. 一.使浏览器兼容ES6基本语法 1.在引入其他脚本前先引入browser.mi ...
- webAudioAPI
- 04_Redis数据类型(set、zset)
[set:集合类型(高中的集合知识)] 集合类型:无序.不可重复 列表类型:有序.可重复 [set类型] 1.添加元素 语法:sadd key member1 member2...... 返回值:返回 ...
- unity导出apk错误出错解决方法
CommandInvokationFailure: Failed to re-package resources. See the Console for details. F:\adt-bundle ...
- RBG灯颜色渐变(颜色要尽可能多)程序分析
相信很多调过RBG灯的朋友都是通过分别改变R.B.G的占空比来改变颜色的,但是不是发现了一个问题,那就是不管怎样调都很难实现几十种颜色的变化,一般只有是7种颜色的渐变.下面给朋友们分享一个可以实现几十 ...