题目大意:
先把每个团体对应一个标号,用该标号对应队列数组。
然后元素入队时先入队列数组,如果该队列没在总的队列中,就把该队列的标号压入总队列,对队列的标号进行标记。
出队是出的是总队列队首标号指向的队列数组中的队列的队首元素,如果出队后该队列为空,总队列队首出队,该队列的标号恢复为未标记。
解题思路:
本题主要设置了总队列que和子队列数组q[1002]和标记数组visit[1002]。如果甲队中的某个成员在总队列中的次序要先于乙队列中所有成员的次序,那么优先输出甲队列中的左右成员。最后才输出乙队列中的所有成员。
/*
* 1387_4.cpp
*
* Created on: 2013年8月8日
* Author: Administrator
* 章泽天是我的女神!!!!
*/
#include <iostream>
#include <queue>
#include <map>
using namespace std;
int main(){
int n,m,t;
char s[20];
int count = 1;
bool visit[1002];
while(scanf("%d",&n),n){
queue<int> q[1002],que;
map<int,int> temp;
for(int i = 0 ; i < n ; ++i ){
scanf("%d",&m);
while(m--){
scanf("%d",&t);
temp[t]=i;
}
}
memset(visit,0,sizeof(visit));
printf("Scenario #%d\n",count++);
while(scanf("%s",s)){
/**
* STOP,
* 输出一个空白行
*/
if(strcmp(s,"STOP")==0){
puts("");
break;
}
/**
* 若为ENQUEUE:
* 先将该成员进入子队列,
* 若总队列还没标记该子队列,则则将子队列进总队列,
* 并设置为已访问
*
*/
else if(strcmp(s,"ENQUEUE") == 0){
scanf("%d",&t);
q[temp[t]].push(t);
if(visit[temp[t]] == false){
que.push(temp[t]);
visit[temp[t]]=true;
}
}else {
/**
* 若为DEQUEUE
* 先将该成员从子队列中去除,
* 若该系队列已空,则将该队列从总队列中去除,
* 并将范文标记设为false
*/
printf("%d\n",q[que.front()].front());
q[que.front()].pop();
if(q[que.front()].empty()){
visit[que.front()] = false;
que.pop();
}
}
}
}
}