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,输入保证操作合法。

// luogu-judger-enable-o2
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
queue<int> a;
queue<int> x[309];

int n,m;
int k;
int t[1000009]={-1};
char z[4];
int ss;
int l;
int s;

inline int read()

{  

   int s=0,w=1;  

   char ch=getchar();  

   while(ch<='0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}  

   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();  

   return s*w;  

}  

int main()
 {
    n=read();m=read();
    {
    for(int i=0;i<=n-1;i++)
     {
      scanf("%d",&m);
      t[i]=m;
      }
     }
     while(~scanf("%s",z))
       { 
     switch(z[1])
     {  
     case 'u':
        scanf("%d",&ss);
         s=t[ss];

         if(x[s].empty())
          {
          a.push(s);
          x[s].push(ss);
          }
         else x[s].push(ss);
     break;

     case 'o':
     int p=a.front();
     printf("%d\n",x[p].front());
     x[p].pop();
     if(x[p].empty())
      a.pop(); 
      break;
       }
      }
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值