QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#329654#5071. Check Pattern is GoodWatwareTL 62ms4220kbC++174.1kb2024-02-17 00:16:052024-02-17 00:16:05

Judging History

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

  • [2024-02-17 00:16:05]
  • 评测
  • 测评结果:TL
  • 用时:62ms
  • 内存:4220kb
  • [2024-02-17 00:16:05]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;

constexpr int M = 220, E = 40010, S = 1, T = 2, inf = 1000000;

bool flag = true;

char c;
int t, n, m, e, mp[M][M], id[M][M], dep[E], x[M], y[M];
int to[E], nxt[E], val[E], head[E], cur[E], tot;

inline void add(int u, int v, int w) {
    to[tot] = v, val[tot] = w, nxt[tot] = head[u], head[u] = tot++;
}
inline void add(int u, int v) {
    // printf("add %d -> %d\n", u, v);
    add(u, v, 1), add(v, u, 0);
}
inline void adde(int u, int v) {
    // printf("add %d -> %d\n", u, v);
    add(u, v + e, inf), add(v + e, u, 0);
    add(v, u + e, inf), add(u + e, v, 0);
}

inline bool bfs() {
    queue<int> q;
    // for (int i = 1; i <= tot; i++) dep[i] = -1;
    memset(dep, -1, tot * sizeof(int));
    dep[S] = 0, q.push(S);
    while (!q.empty()) {
        int p = q.front();
        q.pop();
        for (int i = head[p]; i; i = nxt[i])
            if (val[i] && dep[to[i]] == -1) dep[to[i]] = dep[p] + 1, q.push(to[i]);
    }
    return dep[T] != -1;
}
int dfs(int n, int fl) {
    if (n == T) return fl;
    int lf = fl;
    for (int &i = cur[n]; i; i = nxt[i])
        if (dep[to[i]] == dep[n] + 1 && val[i]) {
            int g = dfs(to[i], min(fl, val[i]));
            lf -= g, val[i] -= g, val[i ^ 1] += g;
            if (!lf) return fl;
        }
    return fl - lf;
}
inline int dinic() {
    int result = 0;
    while (bfs()) memcpy(cur, head, tot * sizeof(int)), result += dfs(S, inf);
    return result;
}

inline void solve() {
    assert(scanf("%d%d", &n, &m)), e = (n - 1) * (m - 1);
    memset(head, 0, sizeof(head)), tot = id[0][0] = 2;
    for (int i = 1; i <= n; i++) {

        for (int j = 1; j <= m; j++) {
            assert(scanf(" %c", &c));
            // if (flag && t == 9988) printf("%c", c);
            if (c == '?') mp[i][j] = -1;
            else mp[i][j] = ((i + j) & 1) ^ (c == 'W');
        }
        // if (flag && t == 9988) printf("\n");
    }
    // if (flag && t != 9988) return;

    int ans = 0;
    for (int i = 1; i < n; i++)
        for (int j = 1; j < m; j++) id[i][j] = ++id[0][0], x[id[0][0]] = i, y[id[0][0]] = j;
    for (int i = 1; i < n; i++)
        for (int j = 1; j < m; j++) {
            bool e0 = false, e1 = false;
            for (int u = i; u <= i + 1; u++)
                for (int v = j; v <= j + 1; v++)
                    if (mp[u][v] == 1) e1 = true;
                    else if (mp[u][v] == 0) e0 = true;
            add(id[i][j], id[i][j] + e, inf), add(id[i][j] + e, id[i][j], 0);
            if (!e1) add(S, id[i][j]), ans++;
            if (!e0) add(id[i][j] + e, T), ans++;
        }
    for (int i = 1; i < n; i++)
        for (int j = 1; j < m; j++) {
            if (i + 1 < n) adde(id[i][j], id[i + 1][j]);
            if (j + 1 < m) adde(id[i][j], id[i][j + 1]);
            if (i + 1 < n && j + 1 < m) adde(id[i][j], id[i + 1][j + 1]);
            if (i + 1 < n && j - 1 >= 1) adde(id[i][j], id[i + 1][j - 1]);
        }
    // printf("!!! %d\n", ans);
    printf("%d\n", ans - dinic());
    bfs();
    // for (int i = 1; i < n; i++)
    //     for (int j = 1; j < m; j++) {
    //         int t = dep[id[i][j]] != -1 ? 0 : 1;
    //         printf("%d %d :: %d\n", i, j, t);
    //         for (int u = i; u <= i + 1; u++)
    //             for (int v = j; v <= j + 1; v++)
    //                 if (mp[u][v] == -1) mp[u][v] = t;
    //     }
    for (int i = head[S]; i; i = nxt[i])
        if (val[i] || dep[to[i]] != -1) {
            // printf("!!! %d %d\n", x[to[i]], y[to[i]]);
            for (int u = x[to[i]]; u <= x[to[i]] + 1; u++)
                for (int v = y[to[i]]; v <= y[to[i]] + 1; v++)
                    assert(mp[u][v] == 0 || mp[u][v] == -1), mp[u][v] = 0;
        }
    for (int i = 1; i <= n; i++, printf("\n"))
        for (int j = 1; j <= m; j++) {
            if (mp[i][j] == -1) mp[i][j] = 1;
            mp[i][j] ^= (i + j) & 1;
            putchar(mp[i][j] ? 'W' : 'B');
        }
}

int main() {

    assert(scanf("%d", &t));
    if (t != 10000) flag = false;
    while (t--) solve();
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

input:

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

output:

1
WB
BW
1
BWW
WWB
WBW
4
BWB
WBW
BWB

result:

ok ok (3 test cases)

Test #2:

score: 0
Accepted
time: 62ms
memory: 4220kb

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
6
BWWBWWB
WBBWWWB
BWWBBBW
BBBWBBB
0
B
W
W
B
B
W
W
W
B
B
15
BWWW
WBWW
WWWB
WBBW
BWWB
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:

ok ok (10000 test cases)

Test #3:

score: 0
Accepted
time: 62ms
memory: 3992kb

input:

10000
9 6
?B?W?W
WWBBWB
?WB?BW
B?W?W?
WW??W?
B???BW
?W?WW?
W?B?B?
?W?BB?
10 1
W
?
?
?
?
?
?
?
B
W
9 4
????
????
W???
?W?B
??WW
?BW?
WW?W
??W?
??W?
3 2
?W
?B
BB
2 7
?W?BWWB
??W???W
9 9
?BW?WWW?W
BW?WBBWWW
W?W????WW
W??WW??WW
W?BWB?B?W
??BB?WWWW
W???WBW?W
WWW???WWW
B?WWWWWW?
8 10
W??BWWW??B
?BWBWBW?BW...

output:

21
WBWWBW
WWBBWB
WWBWBW
BBWBWB
WWBWWB
BBWBBW
BWBWWB
WBBWBW
BWWBBB
0
W
B
W
B
W
B
W
B
B
W
15
WBWB
BWBW
WBWB
BWBB
WBWW
BBWB
WWBW
WBWB
BWWB
1
BW
WB
BB
4
BWBBWWB
WBWWBBW
20
WBWBWWWBW
BWBWBBWWW
WBWBWWBWW
WWBWWBWWW
WBBWBWBBW
BWBBBWWWW
WBWBWBWBW
WWWWBWWWW
BBWWWWWWW
28
WWBBWWWBWB
WBWBWBWWBW
BWBWBWBWBW
WBBWBW...

result:

ok ok (10000 test cases)

Test #4:

score: 0
Accepted
time: 62ms
memory: 3984kb

input:

10000
7 7
?B??BBW
????BB?
WBBB??B
WW?B???
?B??BBB
BBWB??B
B???BB?
10 6
W?WW??
W??W??
?WWWW?
?WW?WW
WW??W?
W?????
W?WW??
WW???W
WWW??W
?W??W?
2 6
?B??W?
B???BB
1 8
??BWB?W?
5 2
WB
W?
B?
BB
?W
7 5
W????
?WW??
???W?
WWWW?
W?W?W
?W?B?
W?WWB
8 5
B?WBW
B??WW
WWW?B
WBBWB
BW?WW
B?W?B
??WWB
BBW?B
10 4
WWWW
?...

output:

15
WBWBBBW
BWBWBBW
WBBBWWB
WWWBWBW
WBBWBBB
BBWBWWB
BWBWBBW
13
WBWWWB
WWBWBW
WWWWWB
BWWWWW
WWWBWB
WWBWBW
WBWWWB
WWBWBW
WWWBWW
BWBWWW
4
WBWBWB
BWBWBB
0
WBBWBBWB
1
WB
WB
BW
BB
WW
12
WBBWB
BWWBW
WBBWB
WWWWB
WBWBW
BWBBW
WBWWB
7
BBWBW
BWBWW
WWWBB
WBBWB
BWBWW
BWWBB
WBWWB
BBWWB
9
WWWW
BBWB
WWBW
WBWB
BWWB
BW...

result:

ok ok (10000 test cases)

Test #5:

score: -100
Time Limit Exceeded

input:

10000
1 1
?
7 9
W?WB????B
?WB??B??W
BBB?W?WB?
WWW??WWW?
WW?B??W?W
?BWW??WWW
B?WW?W?WB
3 7
??BBBB?
BW?WW??
B??B?BW
1 6
?B?WWB
7 1
W
W
W
B
?
W
?
8 8
WW??W?B?
WWW?????
BB??WWWW
?W???WBW
BBW???WB
BWBWBWW?
?W?WW??B
BB?????W
10 8
WWW?W?BW
WB?W?WBW
WW?W?WBW
WWWW?WW?
WBWB?B?W
BW?BW??B
??WWBWWB
W?BW?BWW
W?W?...

output:


result: