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