-优先队列- [洛谷 P1168]中位数

题目描述

Link

Solution

闲来无事写一发水题题解

这道题我们可以用对顶堆来求中位数

创建两个堆,一个大根堆一个小根堆,每次插入一个数就进行比较,插入之后再平衡一下两个堆的大小

但是,非常坑的一点就是:

Code

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
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdio>
#include <queue>
#define MAXN 100010
int n, m, l, a[MAXN];
std::priority_queue <int> q1, q2;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
if (a[1] > a[2]) {
q1.push(a[2]);
q2.push(-a[1]);
}
else {
q1.push(a[1]);
q2.push(-a[2]);
}
printf("%d\n", a[1]);
for (int i = 3; i <= n; i++) {
// printf("%d\n", i);
if (a[i] > q1.top()) {
q2.push(-a[i]);
}
else {
q1.push(a[i]);
}
while ((int)(q2.size() - q1.size()) > 1) {
int b = q2.top();
b = -b;
q2.pop();
q1.push(b);
}
// printf("%d\n", q1.size() - q2.size());
while ((int)(q1.size() - q2.size()) > 1) {
int b = q1.top();
// printf("OK\n");
q1.pop();
q2.push(-b);
}
// puts("OK");
if (i & 1) {
printf("%d\n", (q1.size() > q2.size()) ? q1.top() : -q2.top());
}
}
}
/*
7
1 3 5 7 9 11 6
*/
文章作者: RiverFun
文章链接: https://stevebraveman.github.io/blog/2019/09/23/103/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 RiverFun

评论