题目
【描述】
有一个 n n n行 n n n列的棋盘,每个格子上都有一个硬币,且 n n n为偶数。每个硬币要么是正面朝上,要么是反面朝上。每次操作你可以选定一个格子 ( x , y ) (x,y) (x,y),然后将第 x x x行和第 y y y列的所有硬币都翻面。求将所有硬币都变成同一个面最少需要的操作数。
【数据规模】
对于100%的数据, n ≤ 1 , 000 n ≤ 1,000 n≤1,000。
题解
首先,每个硬币都最多只会翻1次或者一次都不翻(根据贪心,翻2次及以上跟翻该次数模2的情况相同)
选定一个格子,同一列和同一行的硬币均翻转,即在第 i i i行第 j j j列的硬币会受第 i i i行所有硬币和第 j j j列所有硬币翻转的影响。题目询问翻成同一个面所需的代价,不妨先讨论都翻成0面的情况。
可列出方程:
( A 代表硬币的翻转情况 ) ( B 代表硬币的初始状态数组 ) ( ⊕ 为异或 ) (A \text{代表硬币的翻转情况})\quad(B \text{代表硬币的初始状态数组})\quad (\oplus \text{为异或}) (A代表硬币的翻转情况)(B代表硬币的初始状态数组)(⊕为异或)
A 1 , j ⊕ A 2 , j ⊕ . . . ⊕ A n − 1 , j ⊕ A n , j ⊕ A i , 1 ⊕ A i , 2 ⊕ . . . ⊕ A i , j − 1 ⊕ A i , j + 1 ⊕ . . . ⊕ A i , n − 1 ⊕ A i , n ⊕ B i , j = 0 A_{1,j} \oplus A_{2,j} \oplus ... \oplus A_{n-1,j} \oplus A_{n,j} \oplus A_{i,1} \oplus A_{i,2} \oplus ... \oplus A_{i,j-1} \oplus A_{i,j+1} \oplus ... \oplus A_{i,n-1} \oplus A_{i,n} \oplus B_{i,j}= 0 A1,j⊕A2,j⊕...⊕An−1,j⊕An,j⊕Ai,1⊕Ai,2⊕...⊕Ai,j−1⊕Ai,j+1⊕...⊕Ai,n−1⊕Ai,n⊕Bi,j=0
根据异或的性质,得
A 1 , j ⊕ A 2 , j ⊕ . . . ⊕ A n − 1 , j ⊕ A n , j ⊕ A i , 1 ⊕ A i , 2 ⊕ . . . ⊕ A i , j − 1 ⊕ A i , j + 1 ⊕ . . . ⊕ A i , n − 1 ⊕ A i , n = B i , j A_{1,j} \oplus A_{2,j} \oplus ... \oplus A_{n-1,j} \oplus A_{n,j} \oplus A_{i,1} \oplus A_{i,2} \oplus ... \oplus A_{i,j-1} \oplus A_{i,j+1} \oplus ... \oplus A_{i,n-1} \oplus A_{i,n} = B_{i,j} A1,j⊕A2,j⊕...⊕An−1,j⊕An,j⊕Ai,1⊕Ai,2⊕...⊕Ai,j−1⊕Ai,j+1⊕...⊕Ai,n−1⊕Ai,n=Bi,j
这个方程看起来十分冗长,但是,当我们把 n × n n \times n n×n的棋盘每一个都列出如下的方程后,将一个方程与同列及同行所有的方程都合并时,由于 n n n为偶数,所有的 A 1 , j . . . A i − 1 , j A i + 1 , j . . . A n , j A i , 1 . . . A i , j − 1 A i , j + 1 . . . A i , n A_{1,j}\ ...A_{i-1,j}\ A_{i+1,j}\ ...\ A_{n,j}\quad A_{i,1}\ ... \ A_{i,j-1} \ A_{i,j+1}\ ...A_{i,n} A1,j ...Ai−1,j Ai+1,j ... An,jAi,1 ... Ai,j−1 Ai,j+1 ...Ai,n
都是偶数个,于是它们异或变成了0,只有 A i , j A_{i,j} Ai,j是奇数个,方程变成了这样:
A i , j = B 1 , j ⊕ B 2 , j ⊕ . . . ⊕ B n − 1 , j ⊕ B n , j ⊕ B i , 1 ⊕ B i , 2 ⊕ . . . ⊕ B i , j − 1 ⊕ B i , j + 1 ⊕ . . . ⊕ B i , n − 1 ⊕ B i , n A_{i,j}=B_{1,j} \oplus B_{2,j} \oplus ... \oplus B_{n-1,j} \oplus B_{n,j} \oplus B_{i,1} \oplus B_{i,2} \oplus ... \oplus B_{i,j-1} \oplus B_{i,j+1} \oplus ... \oplus B_{i,n-1} \oplus B_{i,n} Ai,j=B1,j⊕B2,j⊕...⊕Bn−1,j⊕Bn,j⊕Bi,1⊕Bi,2⊕...⊕Bi,j−1⊕Bi,j+1⊕...⊕Bi,n−1⊕Bi,n
B i , j B_{i,j} Bi,j是题目中给出的数据,我们就可以很方便的利用异或前缀和来算出 A i , j A_{i,j} Ai,j的值了,答案即为所有 A i , j A_{i,j} Ai,j相加。
还有一种都翻成1面的情况,容易发现这种情况下的答案为$\ n\times n -\text{翻成0面情况的答案}\ ( 即 让 每 个 (即让每个 (即让每个A_{i,j} 都 异 或 1 , 所 有 都异或1,所有 都异或1,所有A_{i,j}$相反),我们在计算了0的情况后只需要与1的情况比较一下大小,输出较小的那个就可以了。