CF1592F1 Alice and Recoloring 1 题解

操作 $2,3$ 可以用 $1,4$ 容斥,所以没用。

设 $b_{i,j}=a_{i,j}\oplus a_{i+1,j}\oplus a_{i,j+1}\oplus a_{i+1,j+1}$,

则操作 $1$ 翻转 $(1,1)$ 到 $(i,j)$ 的矩阵等价于 $b_{i,j}\gets b_{i,j}\oplus 1$,

操作 $4$ 翻转 $(i,j)$ 到 $(n,m)$ 的矩阵等价于 $b_{n,m}\gets b_{n,m}\oplus 1,b_{i-1,m}\gets b_{i-1,m}\oplus 1,b_{n,j-1}\gets b_{n.j-1}\oplus 1,b_{i-1,j-1}\gets b_{i-1,j-1}\oplus 1$。

注意到操作 $4$ 最多做 $1$ 次,因为之后的操作 $4$ 只能影响三个位置,不如操作 $1$。

所以如果可以找到 $b_{n,m}=b_{i-1,m}=b_{n,j-1}=b_{i-1,j-1}=1$,对 $(i,j)$ 到 $(n,m)$ 的矩阵做一次操作 $4$,然后用操作 $1$ 翻转剩下的位置即可。

#include <cstdio>
int n, m, q;
bool a[550][550], b[550][550];
char c;
int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 1;i <= n;++i)
        for(int j = 1;j <= m;++j)
            scanf(" %c", &c), a[i][j] = c == 'B';
    for(int i = 1;i <= n;++i)
        for(int j = 1;j <= m;++j)
            b[i][j] = a[i][j] ^ a[i + 1][j] ^ a[i][j + 1] ^ a[i + 1][j + 1];
    for(int i = 1;i <= n;++i)
        for(int j = 1;j <= m;++j)
            q += b[i][j];
    if(b[n][m])
        for(int i = 1;i < n;++i)
            for(int j = 1;j < m;++j)
                if(b[i][j] && b[i][m] && b[n][j])
                    return !printf("%d", q - 1);
    return !printf("%d", q);
}
posted @ 2023-07-03 10:12  Jijidawang  阅读(7)  评论(0)    收藏  举报  来源