紫书 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;
}

posted @ 2018-04-11 20:35  MCQ  阅读(122)  评论(0编辑  收藏  举报