QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#270711 | #5071. Check Pattern is Good | liangbowen | WA | 40ms | 5580kb | C++14 | 3.5kb | 2023-12-01 12:01:25 | 2023-12-01 12:01:25 |
Judging History
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)