priority_queue<int, vector<int>, greater<int> > a ; // 小
priority_queue<int, vector<int> > b ; // 大
P3871 [TJOI2010] 中位数
P3871需要先构造两个大小堆,大根堆存放较小的一半元素,小根堆存放较大的一半元素,大根堆的对顶就是中位数。假设需要插入x,若x<大根堆对顶,就将x加入大根堆,反之加入小根堆。然后进行判断,大根堆若比小根堆元素多2,就将一个大根堆对顶元素移入小根堆;若小根堆大于大根堆,就将小根堆堆顶元素移入大根堆。最终取大根堆的数即可;
// 插入函数
void pushp(int ned) {
if (b.empty()) {
b.push(ned);
} else {
if (ned <= b.top()) b.push(ned);
else a.push(ned);
}
if (b.size() > a.size() + 1) {
a.push(b.top());
b.pop();
} else if (a.size() > b.size()) {
b.push(a.top());
a.pop();
}
}