哪位大佬谁有时间抽空帮忙看看这个题为什么50(悬一个关注(doge.
查看原帖
哪位大佬谁有时间抽空帮忙看看这个题为什么50(悬一个关注(doge.
520544
Phrvth楼主2023/4/4 22:29

对不起,本蒟蒻无能为力,还请多多指教

#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过,没有新的可疑点出现,则直接推进去即可

注意到,两个完全相同的数删掉前面的还是后面的答案不受影响,故不用考虑顺序问题

2023/4/4 22:29
加载中...