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();
	}
}

haihaihai

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注