[BZOJ3517]翻硬币

题目

【描述】
有一个 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 n1,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,jA2,j...An1,jAn,jAi,1Ai,2...Ai,j1Ai,j+1...Ai,n1Ai,nBi,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,jA2,j...An1,jAn,jAi,1Ai,2...Ai,j1Ai,j+1...Ai,n1Ai,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 ...Ai1,j Ai+1,j ... An,jAi,1 ... Ai,j1 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,jB2,j...Bn1,jBn,jBi,1Bi,2...Bi,j1Bi,j+1...Bi,n1Bi,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的情况比较一下大小,输出较小的那个就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值