zoukankan      html  css  js  c++  java
  • 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
    ",answer);
            }
        }
        
        return 0;    
    }
  • 相关阅读:
    Ext架构分析(6)最简单的layout:AnchorLayout
    Ext架构分析(4)Container之旅
    ext学习资源汇总
    DomQuery v1.1 高级
    Ext 2.0 教程 目录
    HDOJ2006 ( 求奇数的乘积 ) 【水题】
    HDOJ2017 ( 字符串统计 ) 【水题】
    状态模式(State)
    HDOJ2002 ( 计算球体积 ) 【水题】
    HDOJ2007 ( 平方和与立方和 ) 【水题】
  • 原文地址:https://www.cnblogs.com/lyqlyq/p/7095591.html
Copyright © 2011-2022 走看看