显然,每个小组要么没有成员在队列中,要么有连续的一段成员。那么很容易想到在大队列里套着一个个小队列,每个小队列是一个小组。入队时检查当前小组是否已经有了,有了就直接插在小队列末端,否则创建新的小队列;这个检查过程使用指针来完成可以O(1)。删除时从第一个小队列的对头删除,如果发现空了就把这个小队列整个弹出去,并修改指针数组。
#include <bits/stdc++.h>
using namespace std;
struct group_que_t {
int id;
queue<int> que;
};
int group_id[1000010];
group_que_t *ptr[2010];
int main(void) {
int n;
int testcase_id = 0;
while ((cin >> n, n) != 0) {
++testcase_id;
cout << "Scenario #" << testcase_id << endl;
for (int i = 1; i <= n; ++i) {
int m;
cin >> m;
for (int j = 1; j <= m; ++j) {
int member_id;
cin >> member_id;
group_id[member_id] = i;
}
ptr[i] = NULL;
}
queue<group_que_t*> que;
while (1) {
string opt;
cin >> opt;
if (opt == "ENQUEUE") {
int member_id;
cin >> member_id;
int now_group_id = group_id[member_id];
if (ptr[now_group_id] == NULL) {
group_que_t *tmp = new group_que_t;
tmp->id = now_group_id;
tmp->que.push(member_id);
ptr[now_group_id] = tmp;
que.push(tmp);
} else {
ptr[now_group_id]->que.push(member_id);
}
} else if (opt == "DEQUEUE") {
cout << que.front()->que.front() << endl;
que.front()->que.pop();
if (que.front()->que.size() == 0) {
ptr[que.front()->id] = NULL;
delete que.front();
que.pop();
}
} else {
break;
}
}
cout << endl;
}
return 0;
}
指针差评!
个人感觉指针只要能驾驭的了还是可以使用的,而且这确实是实现此题的一种很好的方法啊
还有,您居然down了我!!!ZHK**
.