AcWing 132. 小组队列(注意Segmentation Fault)

题目链接:点击这里
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

因为在任何时刻,同一个小组的人只要来到了队伍,就会站在一起,所以我们建立一个队列 Q 0 Q_0 存储队伍中所有小组的编号,再为每个小组 i i 建立一个队列 Q i Q_i 存储队伍中这个小组的所有成员,一共 n + 1 n+ 1 个队列。换言之,用 1000 1000 个队列维护组内顺序, 1 1 个队列维护组间顺序。

当一个编号为 X X ,组号为 Y Y 的人来到队伍时,我们直接把 X X 插入 Q Y Q_Y 末尾。如果在插入之前 Q Y Q_Y 是空的,则还要把 Y Y 插入到 Q 0 Q_0 末尾,表明队伍最后出现了一个新的小组。

当接收到出队指令时,我们通过 Q 0 Q_0 得知排在最前面的小组组号 Y Y ,然后再把 Q Y Q_Y 的队头出队。出队后如果 Q Y Q_Y 为空,就从 Q 0 Q_0 开头删除 Y Y ,表明这个小组目前所有人已经离开。

#include<iostream>
#include<algorithm>
#include<string>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stack>
#include<queue>
#include<map>
#include<set>

using namespace std;
typedef long long ll;
const int MOD = 10000007;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);
const int maxn = 1010;

int main()
{
	int t;
	int cnt = 0;
	while(~scanf("%d",&t)&&t)
	{
		printf("Scenario #%d\n", ++cnt);
		queue<int> q[maxn];     //维护组内顺序
        queue<int> group;       //维护组间顺序
        unordered_map<int,int> mmp;
		
		for(int i = 1; i <= t; ++i)
		{
			int n;
			scanf("%d", &n);
			for(int j = 1; j <= n; ++j)
			{
				int id;
				scanf("%d", &id);
				mmp[id] = i;
			}
		}
		
		string op;
		while(cin>>op&&op!="STOP")
		{
			if(op=="ENQUEUE")
			{
				int id;
				scanf("%d", &id);
				int g = mmp[id];
				if(q[g].empty())  group.push(g);
				q[g].push(id);
			}
			else if(op=="DEQUEUE")
			{
				if(!group.empty())
				{
				    int g = group.front();
				    if(!q[g].empty())
				    {
				        printf("%d\n", q[g].front());
    					q[g].pop();
    					if(q[g].empty())    group.pop();
				    }
				}
			}
		}
		printf("\n");
	} 
	return 0;
}
发布了727 篇原创文章 · 获赞 111 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/104291014