題目鏈接:點擊這裏
因爲在任何時刻,同一個小組的人只要來到了隊伍,就會站在一起,所以我們建立一個隊列 存儲隊伍中所有小組的編號,再爲每個小組 建立一個隊列 存儲隊伍中這個小組的所有成員,一共 個隊列。換言之,用 個隊列維護組內順序, 個隊列維護組間順序。
當一個編號爲 ,組號爲 的人來到隊伍時,我們直接把 插入 末尾。如果在插入之前 是空的,則還要把 插入到 末尾,表明隊伍最後出現了一個新的小組。
當接收到出隊指令時,我們通過 得知排在最前面的小組組號 ,然後再把 的隊頭出隊。出隊後如果 爲空,就從 開頭刪除 ,表明這個小組目前所有人已經離開。
#include<iostream>
#include<algorithm>
#include<string>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stack>
#include<queue>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
const int MOD = 10000007;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);
const int maxn = 1010;
int main()
{
int t;
int cnt = 0;
while(~scanf("%d",&t)&&t)
{
printf("Scenario #%d\n", ++cnt);
queue<int> q[maxn]; //維護組內順序
queue<int> group; //維護組間順序
unordered_map<int,int> mmp;
for(int i = 1; i <= t; ++i)
{
int n;
scanf("%d", &n);
for(int j = 1; j <= n; ++j)
{
int id;
scanf("%d", &id);
mmp[id] = i;
}
}
string op;
while(cin>>op&&op!="STOP")
{
if(op=="ENQUEUE")
{
int id;
scanf("%d", &id);
int g = mmp[id];
if(q[g].empty()) group.push(g);
q[g].push(id);
}
else if(op=="DEQUEUE")
{
if(!group.empty())
{
int g = group.front();
if(!q[g].empty())
{
printf("%d\n", q[g].front());
q[g].pop();
if(q[g].empty()) group.pop();
}
}
}
}
printf("\n");
}
return 0;
}