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);
}

浙公网安备 33010602011771号