AcWing 132. 小組隊列(注意Segmentation Fault)

題目鏈接:點擊這裏
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

因爲在任何時刻,同一個小組的人只要來到了隊伍,就會站在一起,所以我們建立一個隊列 Q0Q_0 存儲隊伍中所有小組的編號,再爲每個小組 ii 建立一個隊列 QiQ_i 存儲隊伍中這個小組的所有成員,一共 n+1n+ 1 個隊列。換言之,用 10001000 個隊列維護組內順序,11 個隊列維護組間順序。

當一個編號爲 XX,組號爲 YY 的人來到隊伍時,我們直接把 XX 插入 QYQ_Y末尾。如果在插入之前 QYQ_Y 是空的,則還要把 YY 插入到 Q0Q_0 末尾,表明隊伍最後出現了一個新的小組。

當接收到出隊指令時,我們通過 Q0Q_0 得知排在最前面的小組組號 YY,然後再把 QYQ_Y 的隊頭出隊。出隊後如果 QYQ_Y 爲空,就從 Q0Q_0 開頭刪除 YY,表明這個小組目前所有人已經離開。

#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;
}
發佈了734 篇原創文章 · 獲贊 112 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章