求#5,hack全过
查看原帖
求#5,hack全过
725816
Perfect_Youth楼主2025/1/22 12:27

代码如下:

#include <bits/stdc++.h>
#define getchar()(p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
char buf[1 << 21], *p1 = buf, *p2 = buf;

using namespace std;

const int N = 27;

int t, n, a[N], m, opt[N], id1[N], id2[N];

int vis[N], tmpvis[N], cnt, vis3[N], tmpvis3[N], vis4[N], tmpvis4[N];

pair<int, int> vis1[N], vis2[N], tmpvis1[N], tmpvis2[N];

bool flag;

inline
int read() {
	int x = 0, f = 1;
	char ch = getchar();
	while (ch < '0' || ch > '9') {
		if (ch == '-') f = -1;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9') {
		x = (x << 1) + (x << 3) + (ch ^ '0');
		ch = getchar();
	}
	return x * f;
}

int main() {
	t = read(), n = read();
	for (int i = 1; i <= n; i++) {
		a[i] = read();
		if (a[i] == 4) {
		    vis1[i] = {0, 0}, vis2[i] = {0, 0};
		    tmpvis1[i] = vis1[i], tmpvis2[i] = vis2[i];
		}
	}
	for (int ls = 1; ls <= t; ls++) {
		m = read();
		cnt = 0, flag = 1;
		for (int i = 1; i <= n; i++) {
			tmpvis[i] = vis[i]; 
			if (a[i] == 3) {
				vis3[i] = 1;
				tmpvis3[i] = 1;
			}
			if (a[i] == 1) {
				vis4[i] = 1;
				tmpvis4[i] = 1;
			}
			if (a[i] == 4) {
				tmpvis1[i] = vis1[i], tmpvis2[i] = vis2[i];
			}
		}
		for (int yw = 1; yw <= m; yw++) {
			opt[yw] = read(), id1[yw] = read(), id2[yw] = read();
			if (a[id1[yw]] == 2 || id1[yw] < 1 || id2[yw] < 1 || id1[yw] > n || id2[yw] > n) flag = 0;
			if (!flag) continue;
			if (!opt[yw]) {
			    if (a[id1[yw]] != 1) {
			        flag = 0;
			        continue;
			    }
				if (id2[yw] == id1[yw]) {
					flag = 0;
					continue;
				}
				if (vis[id2[yw]] || vis[id1[yw]] || vis4[id1[yw]] <= 0) {
					flag = 0;
					continue;
				}
				vis[id2[yw]] = ls;
				cnt++;
				vis4[id1[yw]]--;
			} else if (opt[yw] == 1) {
			    if (a[id1[yw]] != 4) {
			        flag = 0;
			        continue;
			    }
				if (id2[yw] == id1[yw]) {
					flag = 0;
					continue;
				}
				if (vis[id2[yw]] || vis1[id1[yw]].second || vis[id1[yw]]) {
					flag = 0;
					continue;
				}
				vis[id2[yw]] = ls;
				cnt++;
				vis1[id1[yw]].first++;
				vis1[id1[yw]].second = ls;
			} else if (opt[yw] == 2) {
			    if (a[id1[yw]] != 4) {
			        flag = 0;
			        continue;
			    }
			    if (vis[id1[yw]] == ls && id1[yw] == id2[yw]) {
			    	flag = 1;
			    	vis[id2[yw]] = 0;
			    	continue;
				} else if (vis[id1[yw]]) {
					flag = 0;
					continue;
				}
				if (vis[id2[yw]] != ls || vis2[id1[yw]].second != 0) {
					flag = 0;
					continue;
				}
				vis[id2[yw]] = 0;
				cnt--;
				vis2[id1[yw]].first++;
				vis2[id1[yw]].second = ls;
			} else {
			    if (a[id1[yw]] != 3) {
			        flag = 0;
			        continue;
			    }
				if (id2[yw] == id1[yw]) {
					flag = 0;
					continue;
				}
				if (!vis[id1[yw]] || vis[id2[yw]] || vis3[id1[yw]] <= 0) {
					flag = 0;
					continue;
				}
				vis[id2[yw]] = ls;
				cnt++;
				vis3[id1[yw]]--;
			}
		}
		for (int i = 1; i <= n; i++) {
			if (a[i] == 4) {
				if (vis1[i].first >= 1 && vis2[i].first >= 1 && vis1[i].second == ls && vis2[i].second == ls) {
					flag = 0;
					break;
				}
			}
		}
		if (!flag) {
			puts("Wrong");
			for (int i = 1; i <= n; i++) {
				vis[i] = tmpvis[i];
				vis1[i] = tmpvis1[i];
				vis2[i] = tmpvis2[i];
				vis3[i] = tmpvis3[i];
				vis4[i] = tmpvis4[i];
			}
		} else if (!cnt) puts("Safe");
		else {
			bool flag = 1;
			for (int i = 1; i <= n; i++) {
				if (vis[i] == ls && a[i] == 3) {
					if (vis3[i]) {
						flag = 0;
						break;
					}
				}
			}
			if (!flag) {
				puts("Wrong");
				for (int i = 1; i <= n; i++) {
					vis[i] = tmpvis[i];
					vis1[i] = tmpvis1[i];
					vis2[i] = tmpvis2[i];
					vis3[i] = tmpvis3[i];
					vis4[i] = tmpvis4[i];
				}
				continue;
			}
			printf ("%d ", cnt);
			for (int i = 1; i <= n; i++) {
				if (vis[i] == ls) printf ("%d ", i);
			}
			puts("");
			for (int i = 1; i <= n; i++) {
				tmpvis[i] = vis[i];
				tmpvis1[i] = vis1[i];
				tmpvis2[i] = vis2[i];
				tmpvis3[i] = vis3[i];
				tmpvis4[i] = vis4[i];
			}
		}
	}
	return 0;
}
2025/1/22 12:27
加载中...