1. 程式人生 > 其它 >[DYOJ](2021.12.11)C.查詢

[DYOJ](2021.12.11)C.查詢

C.查詢

先來看看題目

有一個空序列A,有Q次操作,每一次操作是下列3種之一:

  • 1 x: 在序列A的末尾加入x;
  • 2: 輸出A序列的第一個元素,並刪除該元素
  • 3: 對A序列進行升序排序。

輸入格式

第一行一個整數Q。 接下來有Q行,表示Q個操作,操作如題所述。 保證操作2發生的時候,序列不為空。


輸出格式

對每一個操作2,輸出答案。


JD分析一下:
一共只有3種操作,一是末尾加入值,二是輸出排頭值,三是升序排序;
靈機一動,queue是個好東西
哎,但排序咋辦呢?priority_queue也是個好DX;

於是這題有了思路~~~


上程式碼

#include <bits/stdc++.h>
#define
ll long long using namespace std; int q,cz,x,cs1,s[1000010],pla=1,k; queue<ll>in; priority_queue<ll>ansq; int main() { cin>>q; for(int i=1;i<=q;i++) { cin>>cz; if(cz==1) { cin>>x; in.push(x); } if
(cz==2) { if(ansq.empty()) { cout<<in.front()<<endl; in.pop(); } else { cout<<-ansq.top()<<endl; ansq.pop(); } } if(cz==3
) { while(!in.empty()) { ansq.push(-in.front()); in.pop(); } } } return 0; }

Tips

-ans.top()再到-in.front
這兩個-號是咋回事呢?

我們排序想要達到的目的是從小到大排;

而進入ansq後卻是預設從大到小排

該怎麼辦?涼拌

當然有解決方法啦

進入時加上-號取反

從小到大排後正好是我們想要的結果,but,數倒是多了一個-號

於是又雙叒叕地靈機億動

再在ansq裡面家多一個-號再取反

最後get到answer!

JUST LIKE THIS

4 3 2 1 -4 -3 -2 -1 -1 -2 -3 -4 1 2 3 4
Thank you for your watching!