模擬「團隊隊列」:每個元素屬於某個團隊。入隊時,若隊列中已有同團隊成員,則插入到該團隊最後一名成員之後;否則加入隊尾。出隊按正常隊列順序(隊頭優先)。
team_id[element] 快速查找所屬團隊。in_queue[team] 標記團隊是否已在全局隊列中。t = team_id[x]。!in_queue[t]:將團隊 t 加入全局隊列尾部,創建新鏈表節點,in_queue[t]=true。t。in_queue[t]=false。struct Node { int val; Node* next; };
Node* team_head[1001], *team_tail[1001];
int team_of[1000000];
queue global_q;
bool in_q[1001];
void enqueue(int x) {
int t = team_of[x];
Node* node = new Node{x, nullptr};
if (!in_q[t]) {
in_q[t] = true;
global_q.push(t);
team_head[t] = team_tail[t] = node;
} else {
team_tail[t]->next = node;
team_tail[t] = node;
}
}
int dequeue() {
int t = global_q.front();
Node* node = team_head[t];
int val = node->val;
team_head[t] = node->next;
delete node;
if (!team_head[t]) {
global_q.pop();
in_q[t] = false;
}
return val;
}
Scenario #k,每次 DEQUEUE 輸出一行,case 間空行。Team Queue 是典型的「多隊列合併」模擬題。核心在於維護「團隊內部順序」與「團隊全局順序」兩層結構,鏈表+隊列配合實現 O(1) 入隊出隊。注意初始化與邊界條件(空隊列、單元素團隊)。