备战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;
}
NOIP 2018 RP++