蒟蒻调到吐血,单测和多测输出不一样,但是找不到哪个数组没有清空了。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int inf = 0x3f3f3f3f;
inline int fr() {
int x = 1,t = 0;
char ch = getchar();
while(!isdigit(ch)) {
if(ch=='-') x=-1;
ch = getchar();
}
while(isdigit(ch)) {
t=(t<<1)+(t<<3)+(ch^'0');
ch = getchar();
}
return x*t;
}
int T,n,m,k;
const int maxm = 2e6+6,maxn = 305;
int a[maxm];
int ans[maxm*2][3];
int st[305][3];
int tot;
void cc(int op,int x,int y) {
ans[++tot][0] = op;
ans[tot][1] = x;
ans[tot][2] = y;
}
//栈底0
bool vis[maxn*2];
int g[maxn*2];
set<int> q[3];
set<int>::iterator it;
bool bel[maxn*2];
bool fin[maxm];
int emp;
bool place(int cur){
if(!q[1].empty()){
it = q[1].begin();
int j = *it;
st[j][1] = cur;
g[cur] = j;
bel[cur] = 1;
cc(1,g[cur],0);
vis[cur] = 1;
q[1].erase(it);
q[2].insert(j);
return 1;
}else if(!q[0].empty()){
it = q[0].begin();
int j = *it;
st[j][0] = cur;
vis[cur] = 1;
g[cur] = j;
cc(1,g[cur],0);
q[0].erase(it);
q[1].insert(j);
return 1;
}else return 0;
}
void del(int cur){
int ss = g[cur];
if(st[ss][0] == cur) {
cc(1,emp,0);
cc(2,ss,emp);
if(st[ss][1]) {
bel[st[ss][1]] = 0;
st[ss][0] = st[ss][1];
st[ss][1] = 0;
q[2].erase(ss);
q[1].insert(ss);
} else {
st[ss][0] = 0;
q[1].erase(ss);
q[0].insert(ss);
}
} else {
cc(1,ss,0);
bel[st[ss][1]] = 0;
st[ss][1] = 0;
q[2].erase(ss);
q[1].insert(ss);
}
vis[cur] = g[cur] = 0;
}
void work1() {
memset(st,0,sizeof(st));
memset(vis,0,sizeof(vis));
emp = n;
for(int i=1;i<n;i++){
q[0].insert(i);
}
for (int i=1;i<=m;i++) {
int cur = a[i];
if(!vis[cur]) {
place(cur);
} else {
del(cur);
}
}
printf("%d\n",tot);
for (int i=1;i<=tot;i++) {
if(ans[i][0] == 1) printf("%d %d\n",ans[i][0],ans[i][1]); else printf("%d %d %d\n",ans[i][0],ans[i][1],ans[i][2]);
}
}
void work2() {
memset(st,0,sizeof(st));
memset(vis,0,sizeof(vis));
memset(bel,0,sizeof(bel));
memset(fin,0,sizeof(fin));
memset(g,0,sizeof(g));
memset(ans,0,sizeof(ans));
q[0].clear();q[1].clear();q[2].clear();
//空栈
emp = n;
for(int i=1;i<n;i++) q[0].insert(i);
for (int i=1;i<=m;i++) {
if(fin[i]) continue;
int cur = a[i];
if(!vis[cur]){
if(!place(cur)){
int ci = i+1;
while(bel[a[ci]]) ci++;
int fi = a[ci];
int ss = g[fi];
if(fi == cur){
st[emp][0] = cur;
cc(1,emp,0);
for(int j=i+1;j<ci;j++){
int curr = a[j];
if(!vis[curr]) place(curr);
else del(curr);
fin[j] = 1;
}
st[emp][0] = 0;
cc(1,emp,0);
fin[ci] = 1;
}else{
int tmp = 0;
int tp = st[ss][1];
for(int j=i+1;j<ci;j++) if(a[j] == tp) tmp++;
if(tmp&1){
st[emp][0] = cur;
cc(1,emp,0);
q[2].erase(ss);
for(int j=i+1;j<ci;j++){
int curr = a[j];
if(curr == tp){
cc(1,ss,0); // 消去2
}else{
if(!vis[curr]) place(curr);
else del(curr);
}
fin[j] = 1;
}
bel[tp] = 0;
vis[fi] = vis[tp] = g[fi] = g[tp] = 0;
q[1].insert(emp);
g[cur] = emp;
vis[cur] = 1;
emp = ss;
cc(1,ss,0);//消掉1
st[ss][0] = st[ss][1] = 0;
fin[ci] = 1;
}else{
st[ss][2] = cur;
cc(1,ss,0);
for(int j=i+1;j<ci;j++){
int curr = a[j];
if(curr == tp) cc(1,emp,0);
else if(!vis[curr]) place(curr);
else del(curr);
fin[j] = 1;
}
cc(1,emp,0);
cc(2,emp,ss);
bel[st[ss][1]] = 0;
bel[st[ss][2]] = 1;
st[ss][0] = st[ss][1];
st[ss][1] = st[ss][2];
st[ss][2] = 0;
g[cur] = ss;
vis[cur] = 1;
vis[fi] = g[fi] = 0;
fin[ci] = 1;
}
}
}
}else{
del(cur);
}
}
printf("%d\n",tot);
for (int i=1;i<=tot;i++) {
if(ans[i][0] == 1) printf("%d %d\n",ans[i][0],ans[i][1]); else printf("%d %d %d\n",ans[i][0],ans[i][1],ans[i][2]);
}
}
int main() {
T = fr();
while(T--) {
n = fr(),m = fr(),k = fr();
for (int i=1;i<=m;i++) a[i] = fr();
if( k == 2*n-2) work1(); else work2();
tot = 0;
}
}