题意
题解
用 1 1 1 个队列维护已在队中的小组索引,用 t t t 个队列维护各个小组在队中的元素,就能够 O ( 1 ) O(1) O(1) 时间处理各个操作。
#include <algorithm>
#include <cstdio>
#include <queue>
using namespace std;
const int maxn = 1000005, maxt = 1005;
int id[maxn];
queue<int> used, team[maxt];
int main()
{
int t, c = 0;
while (~scanf("%d", &t) && t)
{
printf("Scenario #%d\n", ++c);
while (used.size())
used.pop();
for (int i = 0; i < t; ++i)
{
while (team[i].size())
team[i].pop();
int n, x;
scanf("%d", &n);
for (int j = 0; j < n; ++j)
{
scanf("%d", &x);
id[x] = i;
}
}
char op[10];
while (~scanf(" %s", op) && op[0] != 'S')
{
int x, k;
switch (op[0])
{
case 'E':
scanf("%d", &x);
k = id[x];
if (team[k].empty())
used.push(k);
team[k].push(x);
continue;
case 'D':
k = used.front();
printf("%d\n", team[k].front());
team[k].pop();
if (team[k].empty())
used.pop();
}
}
puts("");
}
return 0;
}