1. 程式人生 > >【C++STL/紅黑樹】POJ 3481 DoubleQueue

【C++STL/紅黑樹】POJ 3481 DoubleQueue

POJ 3481 Double Queue

描述:

新成立的BIG-Bank在不切雷斯特開了一間新辦公室,使用了由IBM羅馬尼亞的現代計算機辦公環境,運用了現代資訊科技.一般來說,銀行的每個顧客都有一個識別碼K,並且每一個來銀行的顧客都會被給予一個優先順序P.銀行主管的一個大膽想法震驚了公司的軟體工程師.他希望有時候能打破傳統,讓服務視窗給優先順序最低的顧客而不是優先順序最高的服務.因此,管理系統會收到以下幾種請求.

 

0

系統停止執行

1 K P

將編號為K的顧客以P的優先順序加入等待名單

2

為優先順序最高的顧客服務並且將其從等待名單中移除

3

為優先順序最低的顧客服務並且將其從等待名單中移除

 

你的任務是幫助軟體工程師來編寫這個顧客管理系統.

 

輸入:

輸入的每一行有一個請求;只有最後一行會要求停止執行(請求0).你需要保證當新增一個新顧客到名單中(請求1)時,名單中沒有編碼相同或優先順序相同的顧客..

 

輸出:

對於請求2和請求3,程式需要在不同行標準輸出客戶編號K,如果此時名單為空,那麼輸出0.

 

Sample Input

2
1 20 14
1 30 3
2
1 10 99
3
2
2
0

Sample Output

0
20
30
10
0

這道題很顯然是平衡樹問題,對於平衡數,C++的STL庫其實有一個自帶的封裝紅黑樹,就是set,這道題如果用STL庫的set就非常簡單了。
注意幾點,這道題需要記錄客戶資料,所以可以新開一個數組來記錄(因為set中的元素就是鍵值也就是優先順序,所以要單獨記錄顧客編號)。

這裡面用到的主要是set裡的insert,end,begin和erase操作,簡單講一下
insert(p)向容器中插入元素p
begin()返回第一個元素的迭代器地址
end()返回最後一個元素的迭代器地址
erase(p)從容器中刪除元素p,這裡要注意,set中元素的值是唯一的。
#include<set>
#include<iostream>
#define MAXN 10000010
using namespace std;
int a[MAXN],c[1000010],k,p,op;
set<int>li(a,a+MAXN);
set<int>::iterator it;
int main(){
    li.clear();
    while(op=(getchar()-'0')){
        if(op==1){
            scanf("%d %d",&k,&p);
            c[p]=k;
            li.insert(p);
        }
        if(op==2){
            if(li.empty()){
                printf("0\n");
                continue;
            }
            it=li.end();
            it--;
            printf("%d\n",c[*it]);
            li.erase(*it);
        }
        if(op==3){
            if(li.empty()){
                printf("0\n");
                continue;
            }
            it=li.begin();
            printf("%d\n",c[*it]);
            li.erase(*it);
        }
    }
}