对不起,本蒟蒻无能为力,还请多多指教
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 7;
int n, q, a[MAXN], v[MAXN];
priority_queue<int> Q1;
priority_queue<int, vector<int>, greater<int>> Q2;
inline void update() {
while (!Q1.empty())
if (a[Q1.top()]) a[Q1.top()] = 0, Q1.pop();
else break;
while (!Q2.empty())
if (a[Q2.top()]) a[Q2.top()] = 0, Q2.pop();
else break;
}
int main () {
cin >> n >> q;
for (int i = 1, x; i <= n; i ++)
cin >> x, v[x] ++, Q1.push(x), Q2.push(x);
while (q -- ){
int op, x;
cin >> op >> x;
if (op == 1) {
if (v[x] <= 0) cout << -1 << '\n';
else {
a[x] ++; update(); v[x] --;
cout << (Q1.top() - Q2.top()) * 2 << '\n';
}
} else {
Q1.push(x); Q2.push(x); v[x] ++;
cout << (Q1.top() - Q2.top()) * 2 << '\n';
}
}
return 0;
}
思路是:考虑动态维护优先队列,分为两种操作
- 将这个数删去,考虑到有可能不在队头,则将他记录下来,每次取得时候update一下(也就是处理队头)
- 添加这个数,由于这个操作前肯定update过,没有新的可疑点出现,则直接推进去即可
注意到,两个完全相同的数删掉前面的还是后面的答案不受影响,故不用考虑顺序问题