[ABC212D] Querying Multiset 题解

[ABC212D] Querying Multiset

Description

给你一个集合,让你支持三种操作:

  • \(x\) 加入集合。

  • 把集合中的数都加上 \(x\)

  • 将集合中最小的数删除,并且输出这个数。


Solution

考虑使用优先队列维护这个集合。

注意到操作 2 这个区间加比较难维护,可以考虑设置一个增加量 \(s\) 来代表所有操作 2 中增加的数。

那么在操作 1 中,输入的 \(x\) 没有增加过 \(s\) ,所以直接 push(x-s)

在操作 2 中比较简单,直接把 \(x\) 加到 \(s\) 里即可。

操作 3 ,直接输出 \(x+s\)

然后就做完了,复杂度 \(O(T\log |S|)\)

#include<bits/stdc++.h>
#define int long long
using namespace std;
long long T,opt,x;
long long diff=0;
priority_queue<int>pq;
signed main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>T;
	while(T--){
		cin>>opt;
		if(opt==1){
			cin>>x;
			pq.push(diff-x);
		}
		else if(opt==2){
			cin>>x;
			diff+=x;
		}
		else{
			cout<<diff-pq.top()<<endl;
			pq.pop();
		}
	}
	return 0;
}
posted @ 2025-12-09 22:01  Creativexz  阅读(3)  评论(0)    收藏  举报