Takahashi has many balls, on which nothing is written, and one bag. Initially, the bag is empty. Takahashi will do Q operations, each of which is of one of the following three types.
For each 1≤i≤Q, you are given the type Pi of the i-th operation and the value of Xi if the operation is of Type 1 or 2. Print the integers recorded in the operations of Type 3 in order.
Input is given from Standard Input in the following format:
Q
query1
query2
::
queryQ
Each queryi in the 2-nd through (Q+1)-th lines is in the following format:
1 Xi
2 Xi
3
The first number in each line is 1≤Pi≤3, representing the type of the operation. If Pi=1 or Pi=2, it is followed by a space, and then by Xi.
For each operation with Pi=3 among the Q operations, print the recorded integer in its own line.
5
1 3
1 5
3
2 2
3
3
7
Takahashi will do the following operations.
Therefore, we should print 3 and 7, in the order they are recorded.
6
1 1000000000
2 1000000000
2 1000000000
2 1000000000
2 1000000000
3
5000000000
Note that the outputs may not fit into a 32-bit integer.
3种操作。操作1:将一个数字\(X_i\)写入。操作2:所有数字加上\(X_i\)。操作3:读取并删除最小的数字
\(Q<=2*10^5,X_i<=10^9\)
要点在于如何快速维护所有当前数字\(+X_i\)
考虑对数字的增加进行全局维护,维护全局的相加和\(nowsum\),最后读取时加上\(nowsum\)表示操作2的影响
当插入一个数字时,则减去当前的\(nowsum\),即抵消掉之前的操作2的影响
每次将\(x_i-nowsum\)插入有限队列,读取时\(+nowsum\)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
priority_queue<ll,vector<ll>,greater<ll> >q;
ll nowsum=0;
int main(){
int Q,opt,x;
cin>>Q;
while (Q--){
scanf("%d",&opt);
if (opt==1){
scanf("%d",&x);
q.push(x-nowsum);
}else if (opt==2){
scanf("%d",&x);
nowsum+=x;
}else{
printf("%lld\n",q.top()+nowsum);
q.pop();
}
}
}
Atcoder 212D Querying Multiset
原文:https://www.cnblogs.com/Y-E-T-I/p/15135234.html