题解 P2776 【[SDOI2007]小组队列】
第一次用到二维队列
用last来表示每一个小组内元素出现的顺序
q队列表示每一个小组出现的顺序
我们想一下,如果一个元素所属的小组在之前出现过
那么我们直接加到last队列里就好
这样可以保证按照小组的顺序输出
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
int read(int & n)
{
char c='.';int x=0,flag=0;
while(c<'0'||c>'9')
{
c=getchar();
if(c=='-')flag=1;
}
while(c>='0'&&c<='9')
{
x=x*10+(c-48);
c=getchar();
}
if(flag==1)n=-x;
else n=x;
}
const int MAXN=10000001;
queue<int>q,last[301];
int group[MAXN];
int main()
{
int n,m,p,meiyong;
read(n);read(meiyong);
for(int i=0;i<n;i++)
read(group[i]);
read(m);
for(int i=1;i<=m;i++)
{
string s;
cin>>s;
if(s=="push")
{
read(p);
if(last[group[p]].empty())
q.push(group[p]);
last[group[p]].push(p);
}
else
{
printf("%d\n",last[q.front()].front());
last[q.front()].pop();
if(last[q.front()].empty())
q.pop();
}
}
return 0;
}