【每日一题】 Running Median 优先队列

Running Median

https://ac.nowcoder.com/acm/problem/50940

题意:动态求中位数

思路:建一个大根堆和一个小根堆 用大根堆维护较小的部分 (中位数左端)用小根堆维护较大的部分(中位数右端)
这样大根堆堆顶的就为中位数 插入数据时维护两堆堆顶的大小关系即可

#include <bits/stdc++.h>

using namespace std;

priority_queue <int> que1;
priority_queue <int,vector<int>,greater<int>> que2;

void init()
{
     while(!que1.empty())
         que1.pop();

     while(!que2.empty())
          que2.pop();

}

int main()
{
    ios::sync_with_stdio(false);

    int t;

    cin >> t;

    while(t --)
    {
         init();

        int m,n;

        cin >> m >> n;

        cout << m << " " << (n + 1)/2 << '\n';

        int cnt = 0;

        for(int i = 1; i <= n; i ++)
        {
            int x;
            cin >> x;

            if(i%2 == 1)
                que1.push(x);
            else
                que2.push(x);

            if(i < 2)
            {
                if(i%2 == 1)
                    cout << que1.top() << ' ',cnt ++ ;
                continue;
            }

            if(que1.top() > que2.top())
            {
                int a = que1.top();
                int b = que2.top();

                que1.pop();
                que2.pop();

                que1.push(b);
                que2.push(a);
            }

            if(cnt == 10)
                cout << '\n',cnt = 0;

            if(i%2 == 1)
                cout << que1.top() << ' ',cnt ++ ;
        }

        cout << '\n';

    }

    return 0;
}
每日一题 文章被收录于专栏

牛客每日一题活动博客

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务