Loading

「学习笔记」可删除堆

原理

就是用两个堆来维护,一个堆存放在堆中的元素,另一个存放应该删除的元素,取堆顶时,看看要取的堆顶元素与要删除的元素堆的堆顶元素是否相同,相同就 pop(),直到堆顶元素不相等或一个堆为空时停止 pop(),取堆顶

代码

struct Heap {// 可删除堆
	priority_queue<ll, vector<ll>, greater<ll> > q1, q2;// q1 插入的元素 q2 要删除的元素
	
	void insert(ll x) {// 插入
		q1.push(x);
	}
	
	void del(ll x) {// 删除
		q2.push(x);
	}
	
	ll get() {// 取堆顶
		while(!q2.empty() && !q1.empty() && q2.top() == q1.top()) {
			q1.pop(), q2.pop();
		}
		return q1.top();
	}
} heap;
posted @ 2022-08-08 09:53  yi_fan0305  阅读(145)  评论(0编辑  收藏  举报