题目
有 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();
}
}
}