原本打算写 k=2n−2 的点,然而全 RE
#include <bits/stdc++.h>
namespace XenonWZH {
void solve() {
int n, m, k;
scanf("%d %d %d", &n, &m, &k);
std::vector<int> a(m + 1);
for (int i = 1; i <= m; i++) scanf("%d", &a[i]);
std::vector<std::deque<int>> s(n + 1);
std::vector<std::pair<int, int>> pos(k + 1, std::make_pair(0, 0));
std::stack<int> remainB, remainT;
std::vector<std::tuple<int, int, int>> ans;
for (int i = 1; i <= n - 1; i++) {
remainB.push(i);
remainT.push(i);
}
for (int i = 1; i <= m; i++) {
if (pos[a[i]] == std::make_pair(0, 0)) {
if (!remainB.empty()) {
ans.emplace_back(1, remainB.top(), -1);
pos[a[i]] = std::make_pair(1, remainB.top());
s[remainB.top()].push_back(a[i]);
remainB.pop();
} else if (!remainT.empty()) {
ans.emplace_back(1, remainT.top(), -1);
pos[a[i]] = std::make_pair(2, remainT.top());
s[remainT.top()].push_back(a[i]);
remainT.pop();
} else {
ans.emplace_back(1, n, -1);
pos[a[i]] = std::make_pair(-1, n);
}
} else {
if (pos[a[i]].first == -1) {
ans.emplace_back(1, n, -1);
}else if (pos[a[i]].first == 1) {
ans.emplace_back(1, n, -1);
ans.emplace_back(2, pos[a[i]].second, n);
s[pos[a[i]].second].pop_front();
} else {
ans.emplace_back(1, pos[a[i]].second, -1);
s[pos[a[i]].second].pop_back();
}
if (s[pos[a[i]].second].empty()) {
remainB.push(pos[a[i]].second);
remainT.push(pos[a[i]].second);
} else pos[s[pos[a[i]].second].front()] = std::make_pair(1, pos[a[i]].second);
pos[a[i]] = std::make_pair(0, 0);
}
}
printf("%zu\n", ans.size());
for (auto each : ans) {
if (std::get<0>(each) == 1) printf("1 %d\n", std::get<1>(each));
else printf("2 %d %d\n", std::get<1>(each), std::get<2>(each));
}
}
int main() {
#ifndef DBG
freopen("meow.in", "r", stdin);
freopen("meow.out", "w", stdout);
#endif
int t;
scanf("%d", &t);
while (t--) solve();
#ifndef DBG
fclose(stdin);
fclose(stdout);
#endif
return 0;
}
};
int main() {
return XenonWZH::main();
}