Running Median
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 2024 | Accepted: 972 |
Description
For this problem, you will write a program that reads in a sequence of 32-bit signed integers. After each odd-indexed value is read, output the median (middle value) of the elements received so far.
Input
The first line of input contains a single integer P, (1 ≤ P ≤ 1000), which is the number of data sets that follow. The first line of each data set contains the data set number, followed by a space, followed by an odd decimal integer M, (1 ≤ M ≤ 9999), giving the total number of signed integers to be processed. The remaining line(s) in the dataset consists of the values, 10 per line, separated by a single space. The last line in the dataset may contain less than 10 values.
Output
For each data set the first line of output contains the data set number, a single space and the number of medians output (which should be one-half the number of input values plus one). The output medians will be on the following lines, 10 per line separated by a single space. The last line may have less than 10 elements, but at least 1 element. There should be no blank lines in the output.
Sample Input
3 1 9 1 2 3 4 5 6 7 8 9 2 9 9 8 7 6 5 4 3 2 1 3 23 23 41 13 22 -3 24 -31 -11 -8 -7 3 5 103 211 -311 -45 -67 -73 -81 -99 -33 24 56
Sample Output
1 5 1 2 3 4 5 2 5 9 8 7 6 5 3 12 23 23 22 22 13 3 5 5 3 -3 -7 -3
Source
思路:对于输入的前2k个数,用一个大根堆存较小的k个数,一个小根堆存较大的k个数,每次插入元素时,与堆顶比较就行了。这个东西叫对顶堆,又可称为中根堆。复杂度nlogn。
#include <iostream> #include <fstream> #include <sstream> #include <cstdlib> #include <cstdio> #include <cmath> #include <string> #include <cstring> #include <algorithm> #include <queue> #include <stack> #include <vector> #include <set> #include <map> #include <list> #include <iomanip> #include <cctype> #include <cassert> #include <bitset> #include <ctime> using namespace std; #define pau system("pause") #define ll long long #define pii pair<int, int> #define pb push_back #define mp make_pair #define clr(a, x) memset(a, x, sizeof(a)) const double pi = acos(-1.0); const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; const double EPS = 1e-9; int T, n, x, ca; vector<int> ans; priority_queue<int, vector<int>, less<int> > que1; priority_queue<int, vector<int>, greater<int> > que2; int main() { scanf("%d", &T); while (T--) { ans.clear(); while (que1.size()) que1.pop(); while (que2.size()) que2.pop(); scanf("%d%d", &ca, &n); for (int i = 1; i <= n; ++i) { scanf("%d", &x); if (que1.size() < que2.size()) { if (que2.size() && x > que2.top()) { que2.push(x); x = que2.top(); que2.pop(); } que1.push(x); } else if (que1.size() > que2.size()) { if (que1.size() && x < que1.top()) { que1.push(x); x = que1.top(); que1.pop(); } que2.push(x); } else { if (que1.empty() || x < que1.top()) { que1.push(x); ans.pb(que1.top()); } else { que2.push(x); ans.pb(que2.top()); } } } printf("%d %d\n", ca, ans.size()); for (int i = 0; i < ans.size(); ++i) { printf("%d", ans[i]); putchar(9 == i % 10 ? ‘\n‘ : ‘ ‘); } if (ans.size() % 10) puts(""); } return 0; }