题目描述
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++) { 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); } while ((int)(q1.size() - q2.size()) > 1) { int b = q1.top(); q1.pop(); q2.push(-b); } if (i & 1) { printf("%d\n", (q1.size() > q2.size()) ? q1.top() : -q2.top()); } } }
|