首页 > 代码库 > luogu P2776 [SDOI2007]小组队列

luogu P2776 [SDOI2007]小组队列

题目背景

嘛,这道非常简单的给大家提供信心的省选题洛谷居然没有!

这么简单的题怎么可以没有!

给大家提升士气是义不容辞的责任!

所以我就来补一下啦..

值得一提的是,标程是我自己做的..

很渣,因为数据很水所以能AC..

大神勿喷..

题目描述

有 m 个小组, n 个元素,每个元素属于且仅属于一个小组。

支持以下操作:

push x:使元素 x 进队,如果前边有 x 所属小组的元素,x 会排到自己小组最后一个元素的下一个位置,否则 x 排到整个队列最后的位置。

pop:出队,弹出队头并输出出队元素,出队的方式和普通队列相同,即排在前边的元素先出队。

输入输出格式

输入格式:

 

第一行有两个正整数 n, m,分别表示元素个数和小组个数,元素和小组均从 0 开始编号。

接下来一行 n 个非负整数 Ai,表示元素 i 所在的小组。

接下来一行一个正整数 T ,表示操作数。

接下来 T 行,每行为一个操作。

 

输出格式:

 

对于每个出队操作输出一行,为出队的元素。

 

输入输出样例

输入样例#1:
4 2
0 0 1 1
6
push 2
push 0
push 3
pop
pop
pop
输出样例#1:
2
3
0

说明

对于30%的数据,1≤n≤100,1≤m≤10,T≤50。

对于100%的数据,1≤n≤100000,1≤m≤300,T≤100000,输入保证操作合法。

 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>

using namespace std;
const int N=310;

queue<int>vec[N];
int peo,group;
int belong[99999];
queue<int>comein;
bool vis[N];
string work;
int me;

int main()
{
    scanf("%d%d",&peo,&group);
    for(int i=0;i<peo;i++)
        scanf("%d",&belong[i]);
    int Q;
    scanf("%d",&Q);
    while(Q--)
    {
        cin>>work;
        if(work[1]==u)
        {
            scanf("%d",&me);
            int zu=belong[me];
            if(!vis[zu])
            {
                comein.push(zu);
                vec[zu].push(me);
                vis[zu]=1;
            }
            else
                vec[zu].push(me);
        }
        else
        {
            int xiaozu=comein.front();
            int cou=vec[xiaozu].front();
            printf("%d\n",cou);
            vec[xiaozu].pop();
            if(vec[xiaozu].size()==0)
                comein.pop(),vis[xiaozu]=0;
        }
    }

    return 0;
}

 

luogu P2776 [SDOI2007]小组队列