MnZn求助
查看原帖
MnZn求助
549875
nosexynomoney楼主2022/12/9 18:06

蒟蒻调到吐血,单测和多测输出不一样,但是找不到哪个数组没有清空了。

#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;
	}
}

2022/12/9 18:06
加载中...