RE on test #1
查看原帖
RE on test #1
769456
Alexoip楼主2024/8/18 19:03

RE on test #1求助

#include <bits/stdc++.h>

using namespace std;

#define i64 long long
#define int long long

const int N = 1e3 + 10;
const int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};

struct Node {
	int a, b;
} g[N][N];

int n, m, k, q, s;
int ans1, ans2, ans3, ans4, ans5;
int tmp[N][N], tp[N][N], vis[N][N], col[N][2], c[N], nowc[N];

void clear() {
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			tp[i][j] = tmp[i][j] = vis[i][j] = 0;
		}
	}
}

void clear_col() {
	for (int i = 1; i <= 200; i++) {
		col[i][0] = col[i][1] = 0;
	}
}

void spl(int x, int y) {
	if (x < 1 || x > n || y < 1 || y > m) {
		return;
	}
	if (tmp[x][y] == -1) {
		return;
	}
	tmp[x][y] = -1;
	if (g[x][y].b == 1) {
		for (int i = 1; i <= m; i++) {
			spl(x, i);
		}
	} else if (g[x][y].b == 2) {
		for (int i = 1; i <= n; i++) {
			spl(i, y);
		}
	} else if (g[x][y].b == 3) {
		for (int i = 1; i <= m; i++) {
			spl(x, i);
		}
		for (int i = 1; i <= n; i++) {
			spl(i, y);
		}
	} else if (g[x][y].b == 4) {
		for (int i = x - 1; i <= x + 1; i++) {
			for (int j = y - 1; j <= y + 1; j++) {
				spl(i, j);
			}
		}
	} else if (g[x][y].b == 5) {
		for (int i = x - 2; i <= x + 2; i++) {
			for (int j = y - 2; j <= y + 2; j++) {
				spl(i, j);
			}
		}
	} else if (g[x][y].b == 6) {
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= m; j++) {
				if (g[i][j].a == g[x][y].a) {
					spl(i, j);
				}
			}
		}
	}
}

void dfs(int x, int y) {
	s++, vis[x][y] = 1;
	for (int k = 0;  k < 4; k++) {
		int nx = x + dx[k], ny = y + dy[k];
		if (nx < 1 || nx > n || ny < 1 || ny > m) {
			continue;
		}
		if (tp[nx][ny] != -1 || g[nx][ny].a != g[x][y].a || vis[nx][ny]) {
			continue;
		}
		dfs(nx, ny);
	}
}

void solve() {
	int lun = 0;
	while (1) {
		lun++;
		clear();
		int cnt = 0;
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= m; j++) {
				if (j >= 3 && g[i][j - 2].a != -1 && g[i][j - 2].a == g[i][j - 1].a && g[i][j - 1].a == g[i][j].a) {
					cnt++;
					tp[i][j - 2] = tp[i][j - 1] = tp[i][j] = -1;
					for (int k = j - 2; k <= j; k++) {
						spl(i, k);
					}
				} if (i >= 3 && g[i - 2][j].a != -1 && g[i - 2][j].a == g[i - 1][j].a && g[i - 1][j].a == g[i][j].a) {
					cnt++;
					tp[i - 2][j] = tp[i - 1][j] = tp[i][j] = -1;
					for (int k = i - 2; k <= i; k++) {
						spl(k, j);
					}
				}
			}
		}
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= m; j++) {
				if (!vis[i][j] && tp[i][j] == -1) {
					dfs(i, j);
					ans3 += 50 * (s - 3) * (s - 3);
					s = 0;
				}
			}
		}
		if (cnt == 0) {
			break;
		}
		int sum = 0;
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= m; j++) {
				if (tmp[i][j] == -1 && g[i][j].a != -1) {
					sum += g[i][j].a;
				}
			}
		}
		ans1 += lun * sum;
		for (int j = 1; j <= m; j++) {
			int p = 0;
			for (int i = n; i >= 1; i--) {
				if (tmp[i][j] == -1) {
					p++;
				} else {
					g[i + p][j] = g[i][j];
				}
			}
			for (int i = 1; i <= p; i++) {
				g[i][j] = {-1, -1};
			}
		}
	}
	ans2 += 80 * (lun - 2) * (lun - 2);
}

bool find_col(int x) {
	int p = (x - 1) % 5 + 1, tot = 0;
	for (int i = 1; i <= k; i++) {
		c[i] = false;
	}
	int sum = 0;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if (j >= 3 && g[i][j - 2].a != -1 && g[i][j - 2].a == g[i][j - 1].a && g[i][j - 1].a == g[i][j].a) {
				sum++;
				if (!c[g[i][j].a]) {
					c[g[i][j].a] = true;
					col[p][++tot] = g[i][j].a;
				}
			}
			if (i >= 3 && g[i - 2][j].a != -1 && g[i - 2][j].a == g[i - 1][j].a && g[i - 1][j].a == g[i][j].a) {
				sum++;
				if (!c[g[i][j].a]) {
					c[g[i][j].a] = true;
					col[p][++tot] = g[i][j].a;
				}
			}
		}
	}
	return !sum;
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> n >> m >> k >> q;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cin >> g[i][j].a;
		}
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cin >> g[i][j].b;
		}
	}
	int cnt = 0;
	bool all = true;
	for (int Q = 1; Q <= q; Q++) {
		int x, y, xx, yy;
		cin >> x >> y >> xx >> yy;
		if (abs(x - xx) + abs(y - yy) != 1 || g[x][y].a == -1 || g[xx][yy].a == -1) {
			all = false;
			continue;
		}
		swap(g[x][y], g[xx][yy]);
		if (find_col(++cnt)) {
			cnt--, all = false;
			swap(g[x][y], g[xx][yy]);
			continue;
		}
		if (cnt % 5 == 0) {
			int ALL = (1 << 5) - 1;
			int maxn = 0;
			for (int a = 1; a <= 2; a++) {
				for (int b = 1; b <= 2; b++) {
					for (int c = 1; c <= 2; c++) {
						for (int d = 1; d <= 2; d++) {
							for (int e = 1; e <= 2; e++) {
								nowc[1] = col[1][a], nowc[2] = col[2][b], nowc[3] = col[3][c], nowc[4] = col[4][d], nowc[5] = col[5][e];
								if (!nowc[1] || !nowc[2] || !nowc[3] || !nowc[4] || !nowc[5]) {
									continue;
								}
								set<int> s;
								for (int i = 1; i <= 5; i++) {
									s.insert(nowc[i]);
								}
								sort(nowc + 1, nowc + 6);
								if (s.size() == 5) {
									maxn = max(maxn, 50 + nowc[5]);
								} else if (s.size() == 4) {
									int p = 0;
									for (int i = 2; i <= 5; i++) {
										if (nowc[i] == nowc[i - 1]) {
											p = i;
											break;
										}
									}
									maxn = max(maxn, 100 + nowc[p] * 2);
								} else if (s.size() == 3) {
									bool fg = false;
									int p = 0;
									for (int i = 3; i <= 5; i++) {
										if (nowc[i] == nowc[i - 1] && nowc[i - 1] == nowc[i - 2]) {
											fg = true, p = i;
											break;
										}
									}
									if (fg) {
										maxn = max(maxn, 300 + nowc[p] * 3);
									} else {
										p = 0;
										int pp = 0;
										for (int i = 2; i <= 5; i++) {
											if (nowc[i] == nowc[i - 1]) {
												if (p) {
													pp = i;
												} else {
													p = i;
												}
											}
										}
										maxn = max(maxn, 200 + nowc[pp] * 2 + nowc[p]);
									}
								} else if (s.size() == 2) {
									bool fg = false;
									int p = 0;
									for (int i = 4; i <= 5; i++) {
										if (nowc[i] == nowc[i - 1] && nowc[i - 1] == nowc[i - 2] && nowc[i - 2] == nowc[i - 3]) {
											fg = true, p = i;
											break;
										}
									}
									if (fg) {
										maxn = max(maxn, 750 + nowc[p] * 5);
									} else {
										p = 0;
										int pp = 0;
										for (int i = 3; i <= 5; i++) {
											if (nowc[i] == nowc[i - 1] && nowc[i - 1] == nowc[i - 2]) {
												p = i;
											}
										}
										for (int i = 2; i <= 5; i++) {
											if (nowc[i] != nowc[p] && nowc[i] == nowc[i - 1]) {
												pp = i;
											}
										}
										maxn = max(maxn, 500 + nowc[p] * 3 + nowc[pp]);
									}
								} else if (s.size() == 1) {
									maxn = max(maxn, 1000 + nowc[1] * 10);
								}
							}
						}
					}
				}
			}
			ans4 += maxn;
			clear_col();	
		}
		solve();
	}
	if (all) {
		ans5 += 1000;
	}
	bool flg = true;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if (g[i][j].a != -1) {
				flg = false;
				break;
			}
		}
		if (!flg) {
			break;
		}
	}
	if (flg) {
		ans5 += 10000;
	}
	cout << ans1 + ans2 + ans3 + ans4 + ans5 << "\n"; 
	return 0;
}
2024/8/18 19:03
加载中...