链接:AT_abc212_d [ABC212D] Querying Multiset - 洛谷
题目描述
高橋君は何も書かれていないたくさんのボールと 1 つの袋を持っています。 最初、袋は空で、高橋君は Q 回の操作を行います。 それぞれの操作は以下の 3 種類のうちのいずれかです。
- 操作 1 : まだ何も書かれていないボール 1 つに整数 Xi を書き込み、袋に入れる。
- 操作 2 : 袋に入っているすべてのボールについて、そこに書かれている数を、それに Xi を加えたものに書き換える。
- 操作 3 : 袋に入っているボールのうち書かれている数が最小のもの(複数ある場合はそのうちの 1 つ)を取り出し、そこに書かれている数を記録する。その後、そのボールを捨てる。
1≤ i≤ Q について i 回目の操作の種類 Pi および操作 1 , 2 における Xi の値が与えられるので、操作 3 において記録された数を順に出力してください。
输入格式
入力は以下の形式で標準入力から与えられる。
Q query1 query2 : queryQ
2 行目から Q+1 行目の各 queryi は次のいずれかの形で与えられる。
1 Xi
2 Xi
3
まず、1≤ Pi≤ 3 が与えられる。これは操作の種類を表す。 Pi=1 または Pi=2 ならば、その後に空白区切りで Xi が与えられる。
输出格式
Q 回の操作のうち操作の種類が Pi=3 であるような各操作について、記録された数を改行区切りで出力せよ。
隐藏翻译
题意翻译
给定一个集合和 Q 次操作,每个操作可能是以下操作之一:
-
第一个操作给定整数 x,表示将 x 放入集合。
-
第二个操作给定整数 x,表示将集合的数分别加上 x。
-
第三个操作将集合最小的数删除。
对于每个第三个操作,输出你删去的数。
保证 1≤Q≤2×105,操作种类 op∈{1,2,3},1≤x≤109。
输入输出样例
输入 #1复制运行
5
1 3
1 5
3
2 2
3
输出 #1复制运行
3
7
输入 #2复制运行
6
1 1000000000
2 1000000000
2 1000000000
2 1000000000
2 1000000000
3
输出 #2复制运行
5000000000
说明/提示
制約
- 1 ≤ Q ≤ 2× 105
- 1 ≤ Pi ≤ 3
- 1 ≤ Xi ≤ 109
- 入力は全て整数である。
- Pi=3 であるような i が 1 つ以上存在する。
- Pi=3 であるとき、 i 回目の操作の直前の時点で、袋には 1 つ以上のボールが入っている。
Sample Explanation 1
高橋君は次のように操作を行います。 - 3 の書かれたボールを袋に入れる。 - 5 の書かれたボールを袋に入れる。 - 今、袋には 3 の書かれたボールと 5 の書かれたボールが入っているため、このうち小さい 3 の書かれたボールを取り出し、 3 を記録した後に捨てる。 - 今、袋には 5 の書かれたボールのみが入っているため、この数を 5+2=7 に書き換える。 - 今、袋には 7 の書かれたボールのみが入っているため、このボールを取り出し、 7 を記録した後に捨てる。 よって、記録された順に 3 , 7 を出力します。
Sample Explanation 2
答えが 32 bit整数に収まらないことがある事に注意してください。
C++代码如下:
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
priority_queue<int,vector<int>,greater<int>> q;
long long sum=0;
for(int i=0;i<n;i++){
int a;
cin>>a;
if(a==1){
int b;
cin>>b;
q.push(b-sum);
}
if(a==2){
int c;
cin>>c;
sum+=c;
}
if(a==3){
cout<<q.top()+sum<<endl;
q.pop();
}
}
return 0;
}