每日一题——Running Median
题目
题解
这题考察的是堆的使用,但要想频繁得出堆中的中位数是极其不方便的,但是我们可以想到建两个堆,左边小的数放在大根堆中,右边大的数放在小根堆中,中位数为大根堆堆顶元素方便取出,每次放入考虑放在哪个堆中,如果堆不平衡只需要移动堆顶元素就行。
参考代码
#include<iostream>
#include<queue>
using namespace std;
int n, m, T;
int main(){
scanf("%d", &T);
while(T --){
priority_queue<int> down; //大根堆
priority_queue<int, vector<int>, greater<int>> up; //小根堆
scanf("%d%d", &n, &m);
printf("%d %d\n", n, (m + 1) / 2);
int cnt = 0;
for(int i = 1; i <= m; i ++){
int x;
scanf("%d", &x);
if(down.empty() || x <= down.top()) down.push(x);
else up.push(x);
if(down.size() > up.size() + 1) up.push(down.top()),down.pop();
if(up.size() > down.size()) down.push(up.top()),up.pop();
if(i % 2){
printf("%d ", down.top());
if(++ cnt % 10 == 0) puts("");
}
}
if(cnt % 10) puts("");
}
return 0;
}

浙公网安备 33010602011771号