D - Querying Multiset

・問題URL

https://atcoder.jp/contests/abc212/tasks/abc212_d

・発想

・本番であと一歩のところ?で解けなかったやつ
・P=2で毎回足すのは無理だから足したふりをして答えだすときに足す
・setの重複ありverみたいなのあれば解けそう

・解法

発想は〇。setの重複ありverはpriority_queueにひと手間加えるだけでいいらしい。くやしい。勉強します……
ちなみにXをintにするとsumが結構大きくなって負の方向でオーバーフローするから注意。

・コード

int main(){

 int Q;
 cin>>Q;
 priority_queue<ll,vector<ll>,greater<ll>>pq;

 ll sum=0;
 rep(i,Q){
   int P;
   cin>>P;

   if(P==1){
     ll X;
     cin>>X;
     X-=sum;
     pq.push(X);

   }

   else if(P==2){
     ll X;
     cin>>X;
     sum+=X;
   }

   else {
     cout<<pq.top()+sum<<endl;
     pq.pop();
   }
   
 }

}

この記事が気に入ったらサポートをしてみませんか?