广州集训 - 0721 思维题选讲 笔记
CF226D The table
考虑如下一个想法:
枚举所有行和所有列,如果其值为负的,就翻转。
这显然是错的,因为你翻完行再翻列的时候可能又把行变成负的了。
那么一个自然的修补方法就是我们多做几次。
实际上,至多做 \(10^6\) 次即可通过。下面我们来证明这个结论:
因为如果一行或一列的和是负的,那么其翻转之后,整个数组的总和至少增加 \(2\)(最少就是 \(-1 \to 1\));但因为 \(|a_i| \le 100\),所以整个数组的和 \(s\) 必须满足 \(-10^6 \le s \le 10^6\),也就是说,我们最多只会进行 \(10^6\) 次操作。因此这样做是对的。
时间复杂度 \(O(nmV(n+m))\)。
注意记录每行每列翻了几次即可,如果翻了偶数次相当于没翻。
CF2154D Catshock
困难题。
首先如果没有这个莫名其妙的限制你直接不停的删点删成一条链就完了。但是这里 \(2\) 操作不能连续做两次。那咋办。
既然实在是无法控制猫往哪里走,我们考虑删那些对猫没有影响的点,反正一共只有 \(n\) 个点。那你就考虑删离猫最远的点。容易发现这个是叶子。
但是如果猫在叶子上呢?没关系,我们可以将树按照猫走几步能到达黑白染色,那么每次删一个叶子的时候,我们看当前步数和这个叶子是否相同,如果是,那么就有概率把猫弄没了,这不行;此时我们让猫走一步,走到白色点上即可。
这样就做完了 qwq。每次最多删一个点,走两步(每一次删完本身就要走一步),因此最多次数不会超过 \(3n\)。
CF45G Prime Problem
谁评的黄。。。
Upd:升青了,好耶。
这个形式很容易让我们想到哥德巴赫猜想,而哥德巴赫猜想在这个小数据范围内早就有了正确性保证,因此可以直接用。
具体来说,我们记 \(m=\sum i=\frac{n(n+1)}{2}\):
-
如果 \(m\) 是偶数,又 \(m \ge 6\),所以 \(m\) 一定能拆成两个奇素数之和。不难发现这两个素数显然都可以用 \(1 \sim n\) 中若干个数的和表示出来。因此此时颜色数为 \(2\)。
-
如果 \(m\) 是奇数,此时先暴力 check 能不能用两个,能则答案为 \(2\);否则,可以拆一个房子 \(3\) 出来单独染一种色,这样剩下的总和就是偶数,可以套用前面的方法,此时答案为 \(3\)。
这样就做完了。时间复杂度 \(O(n^2)\)。
CF487C Prefix Product Sequence
究极 MO 题,咕。

浙公网安备 33010602011771号