有n个小团队,他们在一个大队列中有个顺序。每个人又在他的团队中有个顺序。
然后处理这个大队列——某小团队队尾加人,排第一的小团队减第一个人。
模拟。注意读入。
#include<queue>
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
#define mem(lll) memset(lll,0,sizeof(lll))
int lunhui,t,m,k,cl,td[1006001];
void work(){
mem(td);
printf("Scenario #%d\n",++lunhui); //轮回
for(int i=1;i<=t;++i){ //输入是哪个团队
scanf("%d",&m);
for(int j=1;j<=m;++j){
scanf("%d",&k);
td[k]=i;
}
}
int Q[1001],qt=1,qw=0; //主队列,头,尾
mem(Q);
queue<int> TD[1001]; //团队队列
char c;
c=getchar();
while(c>'Z'||c<'A') c=getchar(); //读入
while(c!='S'){
if(c=='E'){ //判断
for(int i=1;i<=6;++i) //处理一下后面的字符
c=getchar();
scanf("%d",&cl);
if(!TD[td[cl]].size()) //如果这个团队在朱队列没出现过
Q[++qw]=td[cl]; //新建
TD[td[cl]].push(cl); //加入团队队尾
}
else{
for(int i=1;i<=6;++i) //同上
c=getchar();
if(!TD[Q[qt]].size()) //如果本队列已空
++qt;
printf("%d\n",TD[Q[qt]].front()); //输出
TD[Q[qt]].pop(); //删人
}
c=getchar();
while(c>'Z'||c<'A') c=getchar();
}
for(int i=1;i<=3;++i)
c=getchar();
printf("\n");
}
int main(){
while(1) {
scanf("%d",&t);
if(t==0) break;
work();
}
}