[BZOJ3517]翻硬币

探讨在一个nnn行nnn列的棋盘上,通过选择特定格子翻转所在行与列的硬币,以使所有硬币朝向一致。使用异或运算和前缀和方法计算最少操作数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

【描述】
有一个nnnnnn列的棋盘,每个格子上都有一个硬币,且nnn为偶数。每个硬币要么是正面朝上,要么是反面朝上。每次操作你可以选定一个格子(x,y)(x,y)(x,y),然后将第xxx行和第yyy列的所有硬币都翻面。求将所有硬币都变成同一个面最少需要的操作数。

【数据规模】
对于100%的数据,n≤1,000n ≤ 1,000n1,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,jA2,j...An1,jAn,jAi,1Ai,2...Ai,j1Ai,j+1...Ai,n1Ai,nBi,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,jA2,j...An1,jAn,jAi,1Ai,2...Ai,j1Ai,j+1...Ai,n1Ai,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 ...Ai1,j Ai+1,j ... An,jAi,1 ... Ai,j1 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,jB2,j...Bn1,jBn,jBi,1Bi,2...Bi,j1Bi,j+1...Bi,n1Bi,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的情况比较一下大小,输出较小的那个就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值