cogs 717. [SDOI2007] 小组队列

★★ 输入文件:team.in 输出文件:team.out 简单对比
时间限制:1 s 内存限制:128 MB

【问题描述】
队列和优先队列(用堆实现)是常用的数据结构,但是有一种小组队列却很少有人知道,
尽管在生活中经常使用。在人们素质不是很高的地方排队其实不是使用队列,而是小组队列。
在人们索质不是很高的地方,排队往往是这样的:每个人都属于一个小组,并且该小组
的人非常团结。每当一个人来排队的时候,他会先看一下前边有没有自己小组的成员,如果
有的话,他会站到自己小组最后一个成员的后边,如果没有的话,是他最倒霉的时候,他必
须站到整个队列的最后。
现在,要求写一种数据结构来模拟小组队列。
具体问题:有m个小组, n 个元素(编号 0..n-1 ) ,每个元素属于一个小组,当元素 k
进入队列时,如果前边有 k 所属小组的元素,k 会排到自己小组最后一个元素的下一个位
置,否则 k 排到整个队列最后的位置。出队的方式和普通的队列相同,即排在前边的元素先出队。
注:每个元素可能进出队列多次。进出队列的命令最多 100 000 个。
【输入】(team.in)
第一行m (m<= 300)
以下 m 行,每行表示一个小组。每行开始有一个 k 表示该组的元素个数(1 <= k <=总
元素个数),接下来 k 个数,每个数表示该组的一个元素的编号。
以下若干行(以"STOP"结束),每行有“ENQUEUE k” 或“DEQUEUE”,前者表示元素 k 进队,后者表示队头的元素出队。
【输出】(team.out)
对应每个出队命令,按出队顺序依次输出出队的元素,每个一行。
【样例输入】
4
4 0 1 2 3
4 4 5 6 7
4 8 9 10 11
4 12 13 14 15
ENQUEUE 6
ENQUEUE 14
ENQUEUE 1
ENQUEUE 11
ENQUEUE 2
ENQUEUE 4
ENQUEUE 13
ENQUEUE 15
ENQUEUE 12
ENQUEUE 7
ENQUEUE 9
ENQUEUE 10
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
ENQUEUE 8
ENQUEUE 12
ENQUEUE 6
ENQUEUE 3
ENQUEUE 5
ENQUEUE 1
ENQUEUE 4
ENQUEUE 15
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
STOP
【样例输出】


6
4
7
14
13
15
12
1
2
3
1
11
9
10
8
12
15
6
5
4
范围说明:前30% 1<=n<=100 1<=m<=10 进出队命令<=50


全部 1<=n<=100 000 1<=m<=300 命令<=100 000

 

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
 
using namespace std;
const int N=100001;
const int M=310;
 
queue<int>every_group[M];
queue<int>name_group;
int belong[N];
int k,G,member,add,belong_group,top_group,answer;
string how;
bool vis[M];
 
int read()
{
    int x=0;char c=getchar();
    while(c<'0'||c>'9')c=getchar();
    while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
    return x;
}
 
 
int main()
{
    freopen("team.in","r",stdin);
    freopen("team.out","w",stdout);
    
    G=read();
    for(int i=1;i<=G;i++)
    {
        k=read();
        for(int j=1;j<=k;j++)
        {
            member=read();
            belong[member]=i;
        }
    }
    while(1)
    {
        cin>>how;
        if(how=="STOP")
            return 0;
        if(how[0]=='E')
        {
            add=read();
            belong_group=belong[add];
            if(!vis[belong_group])
            {
                name_group.push(belong_group);
                vis[belong_group]=1;
            }
            every_group[belong_group].push(add);
        }
        else
        {
            top_group=name_group.front();
            answer=every_group[top_group].front();
            every_group[top_group].pop();
            if(every_group[top_group].empty())
            {
                name_group.pop();
                vis[top_group]=0;
            }    
            printf("%d\n",answer);
        }
    }
    
    return 0;    
}

 

posted @ 2017-06-29 17:35  ioioioioioio  阅读(170)  评论(0编辑  收藏  举报