「学习笔记」可删除堆
原理
就是用两个堆来维护,一个堆存放在堆中的元素,另一个存放应该删除的元素,取堆顶时,看看要取的堆顶元素与要删除的元素堆的堆顶元素是否相同,相同就 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;
朝气蓬勃 后生可畏