备战NOIP——模板复习15

这里只有模板,并不作讲解,仅为路过的各位做一个参考以及用做自己复习的资料,转载注明出处。

对顶堆

(动态计算中位数)

/*Copyright: Copyright (c) 2018
*Created on 2018-11-04 
*Author: 十甫
*Version 1.0 
*Title: 对顶堆
*Time: ?? mins
*/

// 题目来源:洛谷SP15376 RMID - Running Median
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;

priority_queue <int> big; // 大根堆存小于中位数的数
priority_queue <int, vector <int>, greater <int> > sma; // 小根堆存大于中位数的数

inline void balance() {
    while(big.size() > sma.size()) {
        sma.push(big.top());
        big.pop();
    }
	while(sma.size() > big.size()) {
        big.push(sma.top());
        sma.pop();
    }
    
}

int main() {
    int k;
    while(scanf("%d", &k) != EOF) {
        big.push(k);
        while(1) {
            scanf("%d", &k);
            if(k != -1 && k != 0) {
                if(k > big.top()) sma.push(k);
                else big.push(k);
                balance();
            } else if(k == -1) {
                printf("%d\n", big.top());
                big.pop();
                balance();
            } else {
                printf("\n");
                break;
            }
            //printf("%d %d\n", sma.top(), big.top());
        }
        while(!sma.empty()) {
        	sma.pop();
        }
        while(!big.empty()) {
        	big.pop();
        }
    }
    return 0;
}

 

posted @ 2018-11-04 16:46  十甫  阅读(91)  评论(0编辑  收藏  举报