題解:
如果每次都排序一遍肯定會超時的,可以使用 STL 中自動排序的 Set ,因爲是兩個數,所以加上 pair 就可以。
如果是2,那就尾部選一個,然後刪除掉。
如果是3,就從頭選一個,然後刪除掉。
加上 pair 排序就是先按第一個排,再按第二個,都是從小到大的順序。
注意 set 的begin( ) 和 end( ) 。
一開始的憨憨思路:
最初想的是用兩個優先隊列,一個大的,一個小的,然後開兩個map ,一個記錄優先值,一個記錄是否把該數刪除掉,理論上自己臆想還可以哈哈哈,不過後來發現了這樣很麻煩,寫了會就放棄了,有一些樣例不好處理。
正好複習一下 set 和 pair 使用。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int q,k,p;
set<pair<int ,int > > st;
set<pair<int, int> > :: iterator it;
while(cin >> q && q){
if(q == 1){
cin >> k >> p;
st.insert(make_pair(p,k));
}
else if(q == 2){
if(st.empty()){
cout << 0 << endl;
}
else {
it = st.end();
it--;
cout << it->second << endl;
st.erase(it);
}
}
else if(q == 3){
if(st.empty()){
cout << 0 << endl;
}
else {
it = st.begin();
cout << it->second << endl;
st.erase(it);
}
}
}
return 0;
}
某個銀行很傲嬌,來了一些客戶,有時先接待優先級最高的客戶,有時先接待優先級最低的客戶,有如下四種操作:
0:系統停止服務。
1 K P:增加一個 ID 爲 K(K\leq 10^6)的客戶,其優先級是 P(P\leq 10^7)。
2:查詢優先級最高的客戶,接待他,並從等候隊列裏刪除。
3:查詢優先級最低的客戶,接待他,並從等候隊列裏刪除。
你的任務是依次輸出這些客戶的 ID。
輸入格式
若干行,以 0 結束(總操作數不超過 10^5)。
一個客戶可能訪問多次;保證在任意時刻,隊列中的優先級各不相同。
輸出格式
對於 2 和 3 操作,一行一個整數表示 D,若查詢無結果,則輸出 0。