紫书 UVA540
栈的应用,注意q2[i]全部出列后q也要pop。
/*Input
The input file will contain one or more test cases. Each test case begins with the number of teams
t (1 ≤ t ≤ 1000). Then t team descriptions follow, each one consisting of the number of elements
belonging to the team and the elements themselves. Elements are integers in the range 0..999999. A
team may consist of up to 1000 elements.
Finally, a list of commands follows. There are three different kinds of commands:
• ENQUEUE x — enter element x into the team queue
• DEQUEUE — process the first element and remove it from the queue
• STOP — end of test case
The input will be terminated by a value of 0 for t.
Warning: A test case may contain up to 200000 (two hundred thousand) commands, so the implementation
of the team queue should be efficient: both enqueing and dequeuing of an element should
only take constant time.
Output
For each test case, first print a line saying ‘Scenario #k’, where k is the number of the test case. Then,
for each ‘DEQUEUE’ command, print the element which is dequeued on a single line. Print a blank line
after each test case, even after the last one.
Sample Input
2
3 101 102 103
3 201 202 203
ENQUEUE 101
ENQUEUE 201
ENQUEUE 102
ENQUEUE 202
ENQUEUE 103
ENQUEUE 203
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
STOP
2
5 259001 259002 259003 259004 259005
6 260001 260002 260003 260004 260005 260006
ENQUEUE 259001
ENQUEUE 260001
ENQUEUE 259002
ENQUEUE 259003
ENQUEUE 259004
ENQUEUE 259005
DEQUEUE
DEQUEUE
ENQUEUE 260002
ENQUEUE 260003
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
STOP
0
Sample Output
Scenario #1
101
102
103
201
202
203
Scenario #2
259001
259002
259003
259004
259005
260001*/
#include<iostream>
#include<queue>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
const int maxt=1000+10;
map<int,int>team;
int main()
{
int t,cas=0;
while(cin>>t&&t)
{
cout<<"Scenario #"<<++cas<<endl;
int n,x;
for(int i=0;i<t;i++)
{
cin>>n;
while(n--)
{
cin>>x;
team[x]=i;
}
}
queue<int> q,q2[maxt];//q是团队的队列,q2[i]是团队i的成员
for(;;)
{
int x;
string cmd;
cin>>cmd;
if(cmd[0]=='S')break;
else if(cmd[0]=='E')
{
cin>>x;
int t=team[x];
if(q2[t].empty())q.push(t);
q2[t].push(x);
}
else if(cmd[0]=='D')
{
int c=q.front();
cout<<q2[c].front()<<endl;
q2[c].pop();
if(q2[c].empty())
q.pop();
}
}
cout<<endl;
}
return 0;
}