50pts 求助
查看原帖
50pts 求助
448887
cancan123456楼主2022/12/2 21:36

rt

#include <cstdio>
#include <vector>
using namespace std;
const int N = 305;
const int M = 2000005;
const int K = 605;
int op_ans[M * 2], s1_ans[M * 2], s2_ans[M * 2], cnt;
void print() {
	printf("%d\n", cnt);
	for (int i = 1; i <= cnt; i++) {
		printf("%d %d", op_ans[i], s1_ans[i]);
		if (op_ans[i] == 2) {
			printf(" %d", s2_ans[i]);
		}
		printf("\n");
	}
}
vector < int > stack[N];
void op1(int s, int x) {
	cnt++;
	op_ans[cnt] = 1;
	s1_ans[cnt] = s;
	if (stack[s].size() != 0 && stack[s].back() == x) {
		stack[s].pop_back();
	} else {
		stack[s].push_back(x);
	}
}
void op2(int s1, int s2) {
	cnt++;
	op_ans[cnt] = 2;
	s1_ans[cnt] = s1;
	s2_ans[cnt] = s2;
	if (stack[s1].size() == 0 || stack[s2].size() == 0 || stack[s1][0] != stack[s2][0]) {
		printf("Error.\n");
	} else {
		stack[s1].erase(stack[s1].begin());
		stack[s2].erase(stack[s2].begin());
	}
}
int a[M], belong[K], f[K];
int main() {
	int T;
	scanf("%d", &T);
	for (int n, m, k; T != 0; T--) {
		scanf("%d %d %d", &n, &m, &k);
		for (int i = 1; i <= m; i++) {
			scanf("%d", &a[i]);
		}
		int empty = n;
		cnt = 0;
		for (int i = 1; i <= m; ) {
			int x = belong[a[i]];
			if (x != 0) {
				if (stack[x].back() == a[i]) {
					op1(x, a[i]);
				} else {
					op1(empty, a[i]);
					op2(empty, x);
				}
				belong[a[i]] = 0;
				i++;
			} else {
				int ok = 0;
				for (int j = 1; j <= n; j++) {
					if (j != empty && stack[j].size() <= 1) {
						ok = j;
					}
				}
				if (ok == 0) {
					for (int j = 1; j <= k; j++) {
						f[j] = 0;
					}
					for (int j = 1; j <= n; j++) {
						if (j != empty) {
							f[stack[j][0]] = j;
						}
					}
					f[a[i]] = n + 1;
					int want = 0;
					for (int j = i + 1; ; j++) {
						if (j > m) {
							return 114514;
						}
						if (f[a[j]] != 0) {
							want = j;
							break;
						}
					}
					if (f[a[want]] == n + 1) {
						op1(empty, a[i]);
						for (int j = i + 1; j <= want - 1; j++) {
							int x = belong[a[j]];
							if (x != 0) {
								op1(x, a[j]);
								belong[a[j]] = 0;
							} else {
								int ok = 0;
								for (int p = 1; p <= n; p++) {
									if (p != empty && stack[p].size() <= 1) {
										ok = p;
									}
								}
								op1(ok, a[j]);
								belong[a[j]] = ok;
							}
						}
						op1(empty, a[want]);
					} else {
						int result = f[a[want]];
						int y = stack[result][1];
						int z = stack[result][0];
						int cnt = 0;
						for (int j = i; j <= want; j++) {
							if (a[j] == y) {
								cnt++;
							}
						}
						if (cnt % 2 == 0) {
							op1(result, a[i]);
							belong[a[i]] = result;
							for (int j = i + 1; j <= want - 1; j++) {
								if (a[j] == y) {
									op1(result, y);
								} else {
									int x = belong[a[j]];
									if (x != 0) {
										if (stack[x].back() == a[j]) {
											op1(x, a[j]);
										} else {
											op1(empty, a[j]);
											op2(empty, x);
										}
										belong[a[j]] = 0;
									} else {
										int ok = 0;
										for (int p = 1; p <= n; p++) {
											if (p != empty && stack[p].size() <= 1) {
												ok = p;
											}
										}
										op1(ok, a[j]);
										belong[a[j]] = ok;
									}
								}
							}
							op1(empty, z);
							op2(empty, belong[z]);
							belong[z] = 0;
						} else {
							op1(empty, a[i]);
							belong[a[i]] = empty;
							for (int j = i + 1; j <= want - 1; j++) {
								if (a[j] == y) {
									op1(result, y);
								} else {
									int x = belong[a[j]];
									if (x != 0) {
										if (stack[x].back() == a[j]) {
											op1(x, a[j]);
										} else {
											op1(empty, a[j]);
											op2(empty, x);
										}
										belong[a[j]] = 0;
									} else {
										int ok = 0;
										for (int p = 1; p <= n; p++) {
											if (p != empty && stack[p].size() <= 1) {
												ok = p;
											}
										}
										op1(ok, a[j]);
										belong[a[j]] = ok;
									}
								}
							}
							belong[y] = 0;
							op1(result, z);
							belong[z] = 0;
							empty = result;
						}
					}
					i = want + 1;
				} else {
					op1(ok, a[i]);
					belong[a[i]] = ok;
					i++;
				}
			}
		}
		print();
	}
	return 0;
}

第 83 行出错了。

2022/12/2 21:36
加载中...