每日一题——Running Median

题目

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;
}
posted @ 2025-03-15 16:00  PZnwbh  阅读(14)  评论(0)    收藏  举报