QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#772758#5071. Check Pattern is GoodOIer_kzcWA 75ms5772kbC++203.4kb2024-11-22 21:37:452024-11-22 21:37:46

Judging History

你现在查看的是最新测评结果

  • [2024-11-22 21:37:46]
  • 评测
  • 测评结果:WA
  • 用时:75ms
  • 内存:5772kb
  • [2024-11-22 21:37:45]
  • 提交

answer

#include <stdio.h>
#include <string.h>
#include <assert.h>

#include <algorithm>

#define LOG(FMT...) fprintf(stderr, FMT)

using namespace std;

constexpr int NR = 105, N = 20005, M = 1000005;
constexpr int INF = 0x3f3f3f3f;

int n, m;
char gr[NR][NR];
int S, T;
int h[N], e[M], ne[M], w[M], idx;
int d[N], cur[N], q[N], hh, tt;

void add(int x, int y) {
	ne[++idx] = h[x], h[x] = idx, e[idx] = y, w[idx] = 1;
	ne[++idx] = h[y], h[y] = idx, e[idx] = x, w[idx] = 0;
}

bool bfs() {
	memset(d, 0, T + 1 << 2);
	memcpy(cur, h, T + 1 << 2);
	d[S] = 1, *q = S, hh = tt = 0;
	while (hh <= tt) {
		int x = q[hh++], y;
		for (int i = h[x]; i; i = ne[i])
			if (!d[y = e[i]] && w[i]) {
				d[y] = d[x] + 1;
				q[++tt] = y;
			}
	}
	return d[T] > 0;
}

int find(int x, int limit) {
	if (x == T) {
		return limit;
	}
	int flow = 0, t;
	for (int i = cur[x], y; i && flow < limit; i = ne[i]) {
		y = e[i], cur[x] = i;
		if (d[y] == d[x] + 1 && w[i]) {
			t = find(y, min(limit - flow, w[i]));
			if (!t) d[y] = 0;
			w[i] -= t, w[i ^ 1] += t, flow += t;
		}
	}
	return flow;
}

int dinic() {
	int maxf = 0;
	while (bfs()) {
		maxf += find(S, INF);
	}
	return maxf;
}

int id(int x, int y) {
	assert(0 < x && x < n && 0 < y && y < m);
	return x * m + y;
}

int main() {
	int task;
	for (scanf("%d", &task); task--; ) {
		scanf("%d%d", &n, &m);
		for (int i = 0; i < n; ++i) {
			scanf("%s", gr[i]);
		}
		for (int i = 0; i < n; ++i) {
			for (int j = 0; j < m; ++j) {
				if (gr[i][j] == '?') {
					gr[i][j] = -1;
				} else {
					gr[i][j] = (gr[i][j] == 'B') ^ (i + j & 1);
				}
			}
		}
		/* for (int i = 0; i < n; ++i) {
			for (int j = 0; j < m; ++j) {
				printf("%d ", gr[i][j]);
			}
			puts("");
		} */
		S = 0, T = 2 * n * m + 1;
		memset(h, 0, T + 1 << 2), idx = 1;
		int B = n * m;
		for (int x = 1; x < n; ++x) {
			for (int y = 1; y < m; ++y) {
				for (int dx = -1; dx <= 1; ++dx) {
					for (int dy = -1; dy <= 1; ++dy) {
						int tx = x + dx, ty = y + dy;
						if (tx < 1 || ty < 1 || tx >= n || ty >= m) {
							continue;
						}
						int s = id(x, y), t = id(tx, ty);
						add(s, t + B);
						add(s + B, t);
					}
				}
			}
		}
		int cntv = 0;
		for (int x = 1; x < n; ++x) {
			for (int y = 1; y < m; ++y) {
				int s = id(x, y);
				char v[4] = {gr[x][y], gr[x][y - 1], gr[x - 1][y], gr[x - 1][y - 1]};
				if (find(v, v + 4, 1) == v + 4) {
					// LOG("%d %d S\n", x, y);
					add(S, s);
					++cntv;
				}
				if (find(v, v + 4, 0) == v + 4) {
					// LOG("%d %d T\n", x, y);
					add(s + B, T);
					++cntv;
				}
			}
		}
		// LOG("%d\n", cntv);
		printf("%d\n", cntv - dinic());
		for (int i = h[S]; i; i = ne[i]) {
			int s = e[i];
			if (d[s]) {
				int x = s / m, y = s % m;
				gr[x - 1][y - 1] = gr[x - 1][y] = gr[x][y - 1] = gr[x][y] = 0;
			}
		}
		for (int i = h[T]; i; i = ne[i]) {
			int s = e[i];
			if (!d[s]) {
				s -= B;
				int x = s / m, y = s % m;
				gr[x - 1][y - 1] = gr[x - 1][y] = gr[x][y - 1] = gr[x][y] = 1;
			}
		}
		/* for (int i = 0; i < n; ++i) {
			for (int j = 0; j < m; ++j) {
				printf("%d ", gr[i][j]);
			}
			puts("");
		} */
		for (int x = 0; x < n; ++x) {
			for (int y = 0; y < m; ++y) {
				if (gr[x][y] == -1) {
					gr[x][y] = 0;
				}
				if (x + y & 1) {
					gr[x][y] ^= 1;
				}
				putchar("WB"[gr[x][y]]);
			}
			puts("");
		}
	}
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 5772kb

input:

3
2 2
??
??
3 3
BW?
W?B
?BW
3 3
BW?
W?W
?W?

output:

1
BW
WB
1
BWW
WBB
WBW
4
BWB
WBW
BWB

result:

ok ok (3 test cases)

Test #2:

score: -100
Wrong Answer
time: 75ms
memory: 5748kb

input:

10000
9 2
BB
BW
WW
WW
?W
?B
B?
W?
BB
6 2
??
?B
B?
BW
WW
??
10 7
WBBBW??
???BWWW
???BWWB
??WWBW?
BBWBBWB
WWB?WW?
BWBW???
WWWWBBW
BBWBB?W
B?W?W?B
4 7
??WBWWB
?BBWWWB
?W?BBB?
BBBWBBB
10 1
B
W
?
B
B
W
W
W
B
?
10 4
??WW
W?W?
WWW?
???W
?W??
?W?W
W?W?
?W?W
???W
???W
8 3
WBW
W??
???
???
W?W
W?W
???
?W?
4 1
...

output:

3
BB
BW
WW
WW
BW
WB
BW
WB
BB
2
BW
WB
BW
BW
WW
BW
9
WBBBWBW
BWBBWWW
WBWBWWB
BWWWBWB
BBWBBWB
WWBWWWB
BWBWWBW
WWWWBBW
BBWBBBW
BWWWWWB
4
WBWBWWB
BBBWWWB
WWWBBBW
BBBWBBB
0
B
W
W
B
B
W
W
W
B
B
13
WBWW
WWWW
WWWB
BWBW
WWWB
BWBW
WBWB
BWBW
WBWW
BWBW
8
WBW
WWB
WBW
BWB
WBW
WWW
WBW
BWB
0
W
B
W
B
1
WBWB
WWBB
3
BW...

result:

wrong answer ans finds a larger answer (test case 4)