首页 > 其他分享 >题解: BZOJ3517 翻硬币

题解: BZOJ3517 翻硬币

时间:2024-11-15 20:31:13浏览次数:1  
标签:硬币 题解 BZOJ3517 翻面 操作 oplus

Problem Link

BZOJ3517 翻硬币

题目描述

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

Solution

翻面,常见 $ trick $:将翻面转化为异或操作(因为都是进行两次相同操作等于没操作)。

令原串为 \(s\),\(f_{x, y}\) 代表 \((x, y)\) 是否要进行操作,则有:

\[ s_{x, y} \oplus (\oplus_{i = 1}^n f_{x, i}) \oplus (\oplus_{i = 1}^n f_{i, y}) = 0 \\ \therefore s_{x, y} = (\oplus_{i = 1}^n f_{x, i}) \oplus (\oplus_{i = 1}^n f_{i, y}) \]

而我们要推出 \(f_{x, y}\),所以倒推,得:

\[ (\oplus_ {i = 1} ^ n s_{x, i}) \oplus (\oplus_{i = 1}^n s_{i, y}) \oplus s_{x, y} \\ = (\oplus_ {i = 1} ^ n [ (\oplus _ {j = 1} ^ n f_{j, i}) \oplus (\oplus _ {j = 1} ^ n f_{x, j}) \oplus f _ {x, i} ]) \\ \oplus (\oplus_ {i = 1} ^ n [ (\oplus _ {j = 1} ^ n f_{j, y}) \oplus (\oplus _ {j = 1} ^ n f_{i, j}) \oplus f _ {i, y} ]) \oplus s_{x, y} \\ = (\oplus _ {i = 1} ^ n [(\oplus _ {j = 1} ^ n f_{j, i}) \oplus (\oplus _ {j = 1} ^ n f_{x, j})]) \\ \oplus (\oplus _ {i = 1} ^ n [(\oplus _ {j = 1} ^ n f_{j, y}) \oplus (\oplus _ {j = 1} ^ n f_{i, j})]) \oplus f_{x, y} \\ = f_{x, y} \]

所以 \(f\) 可以用 \(s\) 表示了,异或前缀和即可优化到 \(O(n ^ 2)\)。

Code

#include <iostream>
using namespace std;

#define Maxn 1005
#define fo(i, l, r) for(int i = l; i <= r; ++i)
int n, line[Maxn], col[Maxn], ans;
char s[Maxn][Maxn];

int main()
{
    scanf("%d", &n);
    fo(i, 1, n) scanf("%s", s[i] + 1);

    fo(i, 1, n) fo(j, 1, n) line[i] ^= (s[i][j] - '0'), col[j] ^= (s[i][j] - '0');
    fo(i, 1, n) fo(j, 1, n) ans += line[i] ^ col[j] ^ (s[i][j] - '0');

    printf("%d", min(ans, n * n - ans));

    return 0;
}

标签:硬币,题解,BZOJ3517,翻面,操作,oplus
From: https://www.cnblogs.com/naughty-naught/p/18548610

相关文章

  • ISCTF比赛PWN题前三题题解
    萌新第一次发布题解,如有错误还请各位大佬指出。本次比赛个人pwn出题情况,还是太菜了,后面四题基本看不懂girlfriend解题思路:利用填充覆盖检查位置,绕过前面admin检查,进入vuln函数,经过动调发现,每次数据存放位置,从而达到提权解题过程存在后门函数read可以读取0x30大小,观察buf......
  • P9870 [NOIP2023] 双序列拓展 题解
    P9870[NOIP2023]双序列拓展题解NOIP2023T3,特殊性质题。什么是特殊性质题?就是题目给出了你极其神秘的性质,从而引导你想出正解。本篇题解将从部分分的角度,一步步讲述部分分与正解的关系。这样看的话,本题会变得十分简单。\(\text{Task}1∼7,O(Tnm)\)简化题意其实就是要求......
  • Toyota Programming Contest 2024#11(AtCoder Beginner Contest 379)题解总结
    AtCoderBeginnerContest379Rated:\(770\)A-Cyclic简单模拟。B-Strawberries字符串模拟,substr函数秒了C-Repeating中等模拟。思路:判断是否合法很简单,重点在计算花费。假设我们是\(0\)号点有\(N\)个棋子,然后移动到每个点上,显然花费为\(\frac{N(N+1)}{......
  • [CEOI2023] The Ties That Guide Us 题解
    Description你用销售机器人的利润雇佣了一名助手,现在你准备好去拿走装有CEOI奖章的保险箱了。保险箱位于一所由\(n\)个房间所组成的大学建筑内,这些房间由\(n-1\)扇门连接。每个房间都可以从其他任何房间到达,且每个房间最多与\(3\)扇门相连。你和你的助手都有描述建筑物......
  • P1437 敲砖块 题解
    题意在一个凹槽中放置了\(n\)层砖块、最上面的一层有\(n\)块砖,从上到下每层依次减少一块砖。每块砖都有一个分值,敲掉这块砖就能得到相应的分值,如下图所示:14154323333376221311222331如果你想敲掉第\(i\)层的第\(j\)块砖的话,若\(i=1\),你可以直接......
  • [CEOI2023] Tricks of the Trade 题解
    Description有\(n\)个机器人排成一排,第\(i\)个机器人的购买价是\(a_i\)欧元,卖出价是\(b_i\)欧元。给定\(1\lek\len\),你需要购买一段长度至少为\(k\)的区间中所有的机器人,然后选择其中的恰好\(k\)个机器人来卖出。你需要求出:你能够得到的最大收益;在收益最大化......
  • P11276 第一首歌 题解
    P11276第一首歌题解一道简单的字符串题目。题目解释说求一个最短的字符串\(t\),使其满足对于给定的字符串\(s\):\(s\)为\(t\)的前缀。\(s\)为\(t\)的后缀。\(s\)不为\(t\)。仔细思考一下,则易得\(t\)的最短长度的最大值为\(s\)的两倍。即当\(s\)......
  • 读数据质量管理:数据可靠性与数据质量问题解决之道04收集与清洗
    1.      收集数据1.1.        数据收集和清洗是生产管道中的第一步1.1.1.          数据转换和测试则在生产管道中解决数据质量问题1.2.        在收集数据时,管道的任何地方可能都没有入口点重要,因为入口点是任何数据管道中最上游的位......
  • 题解:P11277 世界沉睡童话
    比较简单的构造。注意到题面给出\(a_i\le2n-1\)的条件,考虑这个有什么用,你会发现从\(n\)到\(2n-1\)这\(n\)个数都是两两互不为约数,所以当我们构造出序列后,这些数可以用来填补空位。\(k\)的上界是\(\frac{n(n-1)}{2}\),显然在全部都为同一个数的时候取到,显然有\(x\)个......
  • Atcoder ABC 216 G 01Sequence 题解 [ 蓝 ] [ 差分约束 ]
    01Sequence:比较板的差分约束,但有一个很妙的转化。朴素差分约束设\(x_i\)表示第\(i\)位的前缀和。我们要最小化\(1\)的个数,就要求最小解,就要求最长路。因为约束条件都是大于等于号,所以求最长路才能满足所有条件。求最大解也是同理。我们可以对于每一个条件,列出如下不等式......