洛谷2776 [SDOI2007]小组队列 队列/链表

题目

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

支持以下操作:

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

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

题解

简直和poj2259一模一样

代码

#include <cstdio>
#include <iostream>
#include <queue>

using namespace std;

int n,m,t;
int a[100005],b[302];
queue<int> q[302]; 

int main(){
    scanf("%d%d",&n,&m);
    for (int i=0;i<n;i++)
        scanf("%d",&a[i]);
    scanf("%d",&t);
    for (;t;t--){
        char ch[6];
        scanf("%s",ch);
        if (ch[1]=='u'){
            int x;
            scanf("%d",&x);
            q[a[x]+1].push(x);
            if (b[a[x]+1]) b[a[x]+1]++; else
            {
                b[a[x]+1]=1;
                q[0].push(a[x]+1);
            }
        } else 
        {
            printf("%d\n",q[q[0].front()].front());
            q[q[0].front()].pop();
            b[q[0].front()]--;
            if (!b[q[0].front()]) q[0].pop(); 
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值