[hdu5249]动态中位数
题意:3种操作分别为入队,出队,查询当前队列的中位数。操作数为1e5数量级。
思路:先考虑离线算法,可以离散+线段树,可以划分树,考虑在线算法,则有treap名次树,SBtree(size balanced tree)等等。
///这个模板有问题,别再用了。。。!!!!
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <queue>using namespace std;const int maxn = 1e5 + 7;template<typename T> class SBTree {public: SBTree() { root = nil = new Node(); nil->ch[0] = nil->ch[1] = nil; nil->sz = 0; tot = top = 0; } ~SBTree() {} void clear() { root = nil; tot = top = 0; } int size() { return root->sz; } bool empty() { return root == nil; } void insert(const T &it) { insert(root, it); } void erase(const T &it) { erase(root, it); } bool find(const T &it) { return find(root, it); } const T &minItem() { return minMax(root, 0); } const T &maxItem() { return minMax(root, 1); } const T &select(int k) { return select(root, k); } int rank(const T &it) { return rank(root, it); }private: const static int maxn = 1e4 + 7; struct Node { T key; int sz; Node *ch[2]; } v[maxn], *stk[maxn], *root, *nil; int tot, top; void rotate(Node *&x, int d) { Node *y = x->ch[d ^ 1]; x->ch[d ^ 1] = y->ch[d]; y->ch[d] = x; y->sz = x->sz; x->sz = x->ch[0]->sz + x->ch[1]->sz + 1; x = y; } void maintain(Node *&x, int d) { if (x == nil) return; if (x->ch[d]->sz < x->ch[d ^ 1]->ch[d ^ 1]->sz) rotate(x, d); else if (x->ch[d]->sz < x->ch[d ^ 1]->ch[d]->sz) { rotate(x->ch[d ^ 1], d ^ 1); rotate(x, d); } else { return; } maintain(x->ch[0], 1); maintain(x->ch[1], 0); maintain(x, 1); maintain(x, 0); } void insert(Node *&x, const T &it) { if (x == nil) { x = top ? stk[top--] : v + tot++; x->key = it; x->sz = 1; x->ch[0] = x->ch[1] = nil; } else { ++x->sz; insert(x->ch[x->key < it], it); maintain(x, it < x->key); } } void erase(Node *&x, const T &it) { Node *p; if (x == nil) return; --x->sz; if (it < x->key) erase(x->ch[0], it); else if (x->key < it) erase(x->ch[1], it); else { if (x->ch[1] == nil) { stk[++top] = x; x = x->ch[0]; } else { for (p = x->ch[1]; p->ch[0] != nil; p = p->ch[0]); erase(x->ch[1], x->key = p->key); } } } bool find(const Node *x, const T &it) { if (x == nil || !(it < x->key || x->key < it)) return x != nil; return find(x->ch[x->key < it], it); } const T &minMax(const Node *x, int d) { return x->ch[d] == nil ? x->key : minMax(x->ch[d], d); } const T &select(const Node *x, int k) { if (x == nil || k == x->ch[0]->sz + 1) return x->key; return select(x->ch[x->ch[0]->sz + 1 < k], x->ch[0]->sz + 1 < k ? k - x->ch[0]->sz - 1 : k); } int rank(const Node *x, const T &it) { if (x == nil) return 1; if (it < x->key) return rank(x->ch[0], it); if (x->key < it) return rank(x->ch[1], it) + x->ch[0]->sz + 1; return x->ch[0]->sz + 1; }};SBTree<int> sbt;int main() {#ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin);#endif // ONLINE_JUDGE int cas = 0, n; while (cin >> n) { printf("Case #%d:\n", ++ cas); sbt.clear(); queue<int> Q; while (n --) { char s[10]; scanf("%s", s); if (s[0] == 'i') { int x; scanf("%d", &x); sbt.insert(x); Q.push(x); } else if (s[0] == 'o') { int x = Q.front(); Q.pop(); sbt.erase(x); } else { int sz = Q.size(); printf("%d\n", sbt.select(sz / 2 + 1)); } } } return 0;} |
[hdu5249]动态中位数的更多相关文章
- AcWing:106. 动态中位数(对顶堆)
依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数. 输入格式 第一行输入一个整数PP,代表后面数据集的个数,接下来若干行输入各个数据集. 每个数据集的第一行首先 ...
- HDU 3282 Running Median 动态中位数,可惜数据范围太小
Running Median Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...
- POJ 3784 Running Median (动态中位数)
题目链接:http://poj.org/problem?id=3784 题目大意:依次输入n个数,每当输入奇数个数的时候,求出当前序列的中位数(排好序的中位数). 此题可用各种方法求解. 排序二叉树方 ...
- hdu5249KPI动态中位数(两个set)
题意(中问题直接粘题意吧) KPI Problem Descr ...
- 动态中位数-POJ 3784
题目: 依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数. 输入格式 第一行输入一个整数P,代表后面数据集的个数,接下来若干行输入各个数据集. 每个数据集的第一 ...
- POJ 3784 Running Median【维护动态中位数】
Description For this problem, you will write a program that reads in a sequence of 32-bit signed int ...
- AcWing 106. 动态中位数
依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数. #include<bits/stdc++.h> using namespace std; pri ...
- luogu_1168: 中位数
洛谷1168:中位数(对顶堆) 题目描述: 给定一个长度为\(N\)的非负整数序列\(A_i\),对于所有\((1\leq k\leq\frac{N+1}{2})\),输出\(A_1,A_3,..., ...
- 牛客练习赛63 C 牛牛的揠苗助长 主席树 二分 中位数
LINK:牛牛的揠苗助长 题目很水 不过做法很多 想到一个近乎O(n)的做法 不过感觉假了 最后决定莽一个主席树 当然 平衡树也行. 容易想到 答案为ans天 那么一些点的有效增长项数为 ans%n. ...
随机推荐
- lua学习之逻辑运算符not,and,or
根据某度查询,lua中的逻辑运算符和其他高级语言大不相同,balabala.我们来看看 广大网友怎么说吧. 版本1: 版本2: 版本3: 揭晓答案: lua中的逻辑与或非与其他语言无差别,都是正常的 ...
- 基于canvas的画板
最近重新在看Html5&CSS3的知识,看到canvas的时候,想到了以前在学校学计算机图形学时做过的画图实验,于是想,可以基于html5和css3来做一款画板,经过1天的努力,完成了画板的一 ...
- Mac os Pycharm 中使用Stanza进行实体识别(自然语言处理nlp)
stanza 是斯坦福开源Python版nlp库,对自然语言处理有好大的提升,具体好在哪里,官网里面都有介绍,这里就不翻译了.下面放上对应的官网和仓库地址. stanza 官网地址:点击我进入 sta ...
- frame/iframe多表单切换
应用场景: 在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位.这时就 ...
- [V&N2020 公开赛]TimeTravel 复现
大佬友链(狗头):https://www.cnblogs.com/p201821440039/ 参考博客: https://www.zhaoj.in/read-6407.html https://cj ...
- Spring5:控制反转
二.Spring IOC控制反转 1:IOC推导 >传统业务调用编程 定义一个userDao接口:UserDao package com.spring; public interface Use ...
- synchronized 作为悲观锁,锁住了什么?
继续来认识 synchronized,上篇文章加不加 synchronized 有什么区别?我们了解了 synchronized 是在多线程并发竞争同一资源的时候使用,这一篇我们来了解,synchro ...
- caddy配置php-fpm
特码的,谷歌又用不了了. 吐槽完毕,正文如下: caddy是一个用go语言开发的服务器,可用作web端. caddy本身支持 -conf caddyfile的配置 在命令行中的体现: caddy -c ...
- JS面向对象编程之封装
来源:https://segmentfault.com/a/1190000015843072 我们所熟知的面向对象语言如 C++.Java 都有类的的概念,类是实例的类型模板,比如Student表示学 ...
- 作业十一——LL(1)文法的判断,递归下降分析程序
作业十一——LL(1)文法的判断,递归下降分析程序 判断是否为LL(1)文法 选取有多个产生式的求select,只有一条产生式的无需求select 同一个非终结符之间求交集,全部判断为空后则为LL(1 ...