[DYOJ](2021.12.11)C.查詢
阿新 • • 發佈:2021-12-14
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> #definell 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 4Thank you for your watching!