中位数POJ3784
思路
题干在这:POJ3784
本题求输入一串数据时动态变化的中位数。建立一对对顶二叉堆,左边是大根堆右边是小根堆,第一个值是第一个中位数。然后对于偶数次输入,根据其与中位数的大小放入相应的堆中,然后记录放入的哪一堆。对于下一个奇数次的输入,要根据上一个数放入的堆和这个数与中位数的大小来更新中位数和两个堆。小根堆我比较懒,就在优先队列放一个数的相反数。
ac代码
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
vector<int> resort[1001];
int main(){
int p;
cin >> p;
for (int i = 1; i <= p; i++) {
priority_queue<int> L, R;
int mid;
int n;
cin >> i >> n;
int before = 0;
for (int j = 1; j <= n; j++) {
int x;
scanf_s("%d", &x);
if (j == 1) {
mid = x;
resort[i].push_back(mid);
}
else if (j % 2 == 0) {
if (x <= mid) {
L.push(x);
before = -1;
}
else {
R.push(-x);
before = 1;
}
}
else {
if (before == -1 && x >= mid)
R.push(-x);
else if (before == -1 && x < mid) {
R.push(-mid);
L.push(x);
mid = L.top();
L.pop();
}
else if (before == 1 && x <= mid)
L.push(x);
else {
L.push(mid);
R.push(-x);
mid = -R.top();
R.pop();
}
resort[i].push_back(mid);
}
}
}
for (int i = 1; i <= p; i++) {
cout << i << ' ' << resort[i].size() << endl;
for (int j = 0; j < resort[i].size(); j++) {
if ((j + 1) % 10 == 0)
cout << resort[i][j] << endl;
else
cout << resort[i][j] << ' ';
}
cout << endl;
}
}