P1168 中位数

题面:https://www.luogu.org/problemnew/show/P1168

本题即用两个堆来处理,一个大根堆和一个小根堆,大根堆中存数列中较小的那一半数值,小根堆中存数列中较大的那一半数值,然后输出中间的数即为中位数.

Code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<ctime>
#include<queue>
using namespace std;
priority_queue<int,vector<int> > Q;
priority_queue<int,vector<int>,greater<int> > q;
int x,n,a;
int main(){
    scanf("%d%d",&n,&x);
    Q.push(x);
    printf("%d\n",x);
    for(int i=2;i<=n;i++){
        scanf("%d",&a);
        if(a>Q.top()){
            q.push(a);
        }
        else{
            Q.push(a);
        }
        int length=Q.size()-q.size();
        while(abs(length)>1){
            if(Q.size()>q.size()){
                q.push(Q.top());
                Q.pop();
            }
            else{
                Q.push(q.top());
                q.pop();
            }
            length=Q.size()-q.size();
        }
        if(i%2==1){
            if(Q.size()>q.size()){
                printf("%d\n",Q.top());
            }
            else{
                printf("%d\n",q.top());
            }
        }
    }
    return 0;
}
posted @ 2019-07-16 13:43  prestige  阅读(171)  评论(0编辑  收藏  举报