QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#270711#5071. Check Pattern is GoodliangbowenWA 40ms5580kbC++143.5kb2023-12-01 12:01:252023-12-01 12:01:25

Judging History

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

  • [2023-12-01 12:01:25]
  • 评测
  • 测评结果:WA
  • 用时:40ms
  • 内存:5580kb
  • [2023-12-01 12:01:25]
  • 提交

answer

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define EMPTY(arr) for (int i = 0; i <= 2 * n * m + 5; i++) arr[i] = 0
using namespace std;
const int N = 114514, inf = 0x3f3f3f3f, dict[9][2] = {{-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 0}, {0, 1}, {1, -1}, {1, 0}, {1, 1}};
struct Edge {int now, nxt, u, w;} e[1919810];
int head[N], _head[N], cur = 1;
void ad(int u, int v, int w) {e[++cur].now = v, e[cur].u = u, e[cur].nxt = head[u], e[cur].w = w, head[u] = cur;}
void add(int u, int v, int w) {ad(u, v, w), ad(v, u, 0);}

int n, m, s, t; char a[105][105];
void chg(char &x) {x = (x == 'B' ? 'W' : x == 'W' ? 'B' : '?');}
bool black(char v) {return v != 'W';}
bool white(char v) {return v != 'B';}
int black(int x, int y) {return (x - 1) * m + y;}
int white(int x, int y) {return (x - 1) * m + y + n * m;}
pair <int, int> toxy(int u) {return (u % m == 0 ? (pair <int, int>){u / m, m} : (pair <int, int>){u / m + 1, u % m});}

namespace Flow {
	int dis[N]; bool vis[N];
	bool bfs()
	{
		queue <int> q; EMPTY(vis);
		q.push(s), vis[s] = true, dis[s] = 0, _head[s] = head[s];
		while (!q.empty())
		{
			int u = q.front(); q.pop();
			for (int i = head[u]; i; i = e[i].nxt)
			{
				int v = e[i].now;
				if (vis[v] || !e[i].w) continue;
				vis[v] = true, dis[v] = dis[u] + 1, q.push(v), _head[v] = head[v];
				if (v == t) return true;
			}
		}
		return false;
	}
	int dfs(int u, int maxflow)
	{
		if (u == t) return maxflow;
		int flow = 0;
		for (int i = _head[u]; i && flow < maxflow; i = e[i].nxt)
		{
			_head[u] = i; int v = e[i].now;
			if (dis[v] != dis[u] + 1 || !e[i].w) continue;
			int ww = dfs(v, min(e[i].w, maxflow - flow));
			if (!ww) dis[v] = -inf;
			e[i].w -= ww, e[i ^ 1].w += ww, flow += ww;
		}
		return flow;
	}
	int dinic()
	{
		int ans = 0;
		while (bfs()) ans += dfs(s, inf);
		return ans;
	}
}
char ans[105][105];
void solve()
{
	cin >> n >> m, s = 0, t = 2 * n * m + 1;
	cur = 1; EMPTY(head);
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			{cin >> a[i][j]; if ((i + j) & 1) chg(a[i][j]);}
	int tot = 0;
	for (int x = 1; x < n; x++)
		for (int y = 1; y < n; y++)
		{
			//s 连 Black,t 连 White
			if (black(a[x][y]) && black(a[x + 1][y]) && black(a[x][y + 1]) && black(a[x + 1][y + 1])) add(s, black(x, y), 1), tot++;
			if (white(a[x][y]) && white(a[x + 1][y]) && white(a[x][y + 1]) && white(a[x + 1][y + 1])) add(white(x, y), t, 1), tot++;
			for (int i = 0; i < 9; i++)
			{
				int dx = x + dict[i][0], dy = y + dict[i][1];
				if (1 <= dx && dx < n && 1 <= dy && dy < m) add(black(x, y), white(dx, dy), inf);
			}
		}
	cout << tot - Flow::dinic() << '\n'; //总数-最小割

	for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) ans[i][j] = '%';
	for (int i = 1; i <= cur; i += 2)
	{
		int u = e[i].u, v = e[i].now, w = e[i].w;
		if (w) //没被榨干,这一部分没被割掉
		{
			if (u == s) {auto [x, y] = toxy(v);         ans[x][y] = ans[x + 1][y] = ans[x][y + 1] = ans[x + 1][y + 1] = 'B';}
			if (v == t) {auto [x, y] = toxy(u - n * m); ans[x][y] = ans[x + 1][y] = ans[x][y + 1] = ans[x + 1][y + 1] = 'W';}
		}
	}
	for (int i = 1; i <= n; i++, cout << '\n')
		for (int j = 1; j <= m; j++)
			{
				ans[i][j] = (ans[i][j] == '%' ? (a[i][j] == '?' ? 'B' : a[i][j]) : ans[i][j]);
				if ((i + j) & 1) chg(ans[i][j]);
				cout << ans[i][j];
			}
}
int main()
{
	ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
	int T;
	cin >> T;
	while (T--) solve();
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 5580kb

input:

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

output:

1
BW
WB
1
BWB
WBB
BBW
4
BWB
WBW
BWB

result:

ok ok (3 test cases)

Test #2:

score: -100
Wrong Answer
time: 40ms
memory: 3448kb

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:

85
BB
BW
WW
WW
BW
WB
BW
WB
BB
29
BW
WB
BW
BW
WW
WB
38
WBBBWWB
WBWBWWW
BWBBWWB
WBWWBWW
BBWBBWB
WWBBWWW
BWBWBWB
WWWWBBW
BBWBBWW
BBWBWBB
5
BWWBWWB
WBBWWWB
BWBBBBB
BBBWBBB
51
B
W
B
B
B
W
W
W
B
W
45
BWWW
WBWB
WWWW
WBWW
BWBW
WWWW
WWWW
WWWW
BWBW
WBWW
21
WBW
WBW
BWB
WBW
WWW
WBW
BWB
WWW
12
W
B
B
W
0
BBBB
WBW...

result:

wrong answer Integer parameter [name=ans] equals to 85, violates the range [0, 18] (test case 1)