UVA540 團體佇列 Team Queue 題解
阿新 • • 發佈:2021-07-14
0x00 前言
自己整了個翻譯呢
一開始寫的超級複雜
後開借鑑別人思路才知道其實不長
0x01 讀題
在團隊佇列中,每個元素都屬於一個團隊。
如果元素進入佇列。它首先從頭到尾搜尋隊列,檢查它的一些團隊成員(同一團隊的元素)是否已經在佇列中。如果是,它就插入它們的後面。如果不是,它將在尾部進入佇列併成為新的最後一個元素。
退出佇列的操作與普通佇列類似:元素按照它們在團隊佇列中出現的順序從頭到尾進行處理。
您的任務是編寫一個程式來模擬這樣的團隊佇列。
輸入檔案將包含一個或多個測試樣例。
每個測試樣例從團隊數量 \(t\ (1 <t< 1000)\) 開始。
接下來是對團隊的描述,每個描述包含屬於團隊的元素的數量和元素本身。元素是 \(\left[0,1000000\right)\)
最後,下面是一個命令列表。有三種不同的命令:
-
\(\mathtt{ENQUEUE}\ x\):在團隊佇列中輸入元素 \(x\)
-
\(\mathtt{DEQUEUE}\):處理第一個元素並將其從佇列中移除
-
\(\mathtt{STOP}\):結束測試用例
測試樣例結束時輸入 \(0\)
警告:一個測試樣例可能包含多達 \(200000\) 個命令,因此查詢和退出一個元素應該只花費常量時間。
對於每個測試用例,首先列印一行\(Scenario #k\),其中 \(k\) 是測試樣例的編號。
然後,對於每個 \(\mathtt{DEQUEUE}\)
在每個測試樣例之後輸出空行,在最後一個測試樣例之後也是如此。
0x02 分析
模擬,它是個模擬
不廢話了
0x03 程式碼
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=200100; inline ll read(){ ll x=0,y=1; char c=getchar(); while (c<'0'||c>'9'){ if(c=='-') y=-1; c=getchar(); } while(c>='0'&&c<='9'){ x=x*10+c-'0'; c=getchar(); } return x*y; } int main(){ int t,m=1; while(cin>>t&&t){ map<int,int> v; for(int i=1;i<=t;i++){ int n; n=read(); while(n--){ int x; x=read(); v[x]=i; } } cout<<"Scenario #"<<m++<<endl; queue<int> team[N]; queue<int> total; string op; while(cin>>op){ if(op=="STOP") break; if(op=="ENQUEUE"){ int x; x=read(); int t=v[x]; if(team[t].empty()) total.push(t); team[t].push(x); } if(op=="DEQUEUE"){ if(!total.empty()){ int t=total.front(); cout<<team[t].front()<<endl; team[t].pop(); if(team[t].empty()) total.pop(); } } } printf("\n"); } return 0; }