我们可以用 list 模拟队列,在更新队列的同时维护一个 unordered_map 记录元素出现的位置。
为了操作,我们定义 A1 表示排队列,A2 表示游玩队列。
对于操作 start,将 A2 的元素放入 A1 的尾部,然后将 A1 队头的元素放入 A2。如果 A1 为头则输出 Error。
while (!A2.empty()) {
string x = A2.front();
A2.pop_front();
S2.erase(x);
A1.push_back(x);
S1[--A1.end()];
}
if (A1.empty()) {
cout << "Error\n";
continue;
}
int cnt = 0;
while (!A1.empty() && cnt < 2) {
string x = A1.front();
A1.pop_front();
S2.erase(x);
A2.push_back(x);
S2[x] = ++cnt;
cout << x << ' ';
}
cout << '\n';
对于操作 arrive,如果 x 在 A1 或 A2 中则输出 Error,否则将 x 放到 A1 的队尾,并输出 OK。
对于操作 arrive,如果 x 在 S1 或 S2 中则输出 Error,否则将 x 放到 A1 的队尾,并输出 OK。
if (S1.contains(x) || S2.contains(x)) {
cout << "Error\n";
continue;
}
A1.push_back(x);
S1[x] = --A1.end();
cout << "OK\n";
对于操作 leave,如果 x 不在 A1 中则输出 Error,否则根据记录的位置将 x 在 A1 删除,并输出 OK。
if (!S1.contains(x)) {
cout << "Error\n";
continue;
}
A1.erase(S1[x]);
S1.erase(x);
cout << "OK\n";
#include iostream
#include list
#include unordered_map
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
string op;
list string A1, A2;
unordered_map string, list string ::iterator> S1, S2;
cin >> n;
while (n--) {
cin >> op;
if (op == "start") {
while (!A2.empty()) {
string x = A2.front();
A2.pop_front();
S2.erase(x);
A1.push_back(x);
S1[x] = --A1.end();
}
if (A1.empty()) {
cout << "Error\n";
continue;
}
int cnt = 0;
while (!A1.empty() && cnt < 2) {
string x = A1.front();
A1.pop_front();
S2.erase(x);
A2.push_back(x);
S2[x] = ++cnt;
cout << x << ' ';
}
cout << '\n';
}
}