CF 瞎写记录
不定期更新。
CF1166E - The LCMs Must be Large *2100
结论题。
\(\operatorname{Key Observation}\):答案为 possible 的充要条件任意两天选取的商铺集合都有交集。
必要性证明
假设两个集合 \(A, B\) 没有交集,可以发现 \(A \subseteq C_uB, B \subseteq C_uA\),故 \(C_uB\) 集合的 \(\operatorname{lcm}\) 必不小于 \(A\) 集合的 \(\operatorname{lcm}\),\(B\) 集合的 \(\operatorname{lcm}\) 必不大于 \(C_uA\) 集合的 \(\operatorname{lcm}\)。这时,如果 \(A\) 集合的 \(\operatorname{lcm}\) 大于 \(C_uA\) 集合的 \(\operatorname{lcm}\),即可推出 \(B\) 集合的 \(\operatorname{lcm}\) 小于 \(C_uB\) 集合的 \(\operatorname{lcm}\),矛盾,故任意两个集合间必定存在交集。
充分性证明
考虑这样一种构造,假设所有元素初始时全部为 \(1\),每次把给定的第 \(i\) 个集合内所有数都乘上第 \(i\) 个质数。可以发现,当任意两个集合都相交时,这种构造总是对的。
CF1305F - Kuroni and the Punishment *2500
居然是随机化!
考虑答案的上界是多少。很显然,我们可以把所有数都变成偶数,所以最优解的操作次数不会超过 \(n\)。
也就是说,我们至多对 \(\frac{n}{2}\) 的元素执行两次或更多的操作,其余元素统统只会执行小于等于一次操作!我们可以随机一个数 \(x\),对于 \(x\)、\(x+1\)、\(x-1\) 分解质因数,再枚举质因数作为所有数的 \(\gcd\) 计算答案。每次随机正确率不会低于 \(\frac{1}{2}\),随 \(100\) 次即可通过。
CF1314D - Tourism *2300
仍然是是随机化。
容易发现没有奇环的充要条件是走过的边连成的图是一个 二分图。于是可以对点随机黑白染色,每次只能从一种颜色的点走到另一种颜色的点,瞎 dp 就行啦。
这东西正确性大概在 \(\frac{1}{512}\) 左右,所以随 \(5000\) 次就行了。
CF1746E1 - Joking (Easy Version) *2500
很有趣的交互题。考虑将 \(n (n \geq 4)\) 个数的范围缩小,记 \(\operatorname{mid}\) 为 \(1 - n\) 的中点,考虑询问集合 \([1, \operatorname{mid}]\),如下图所示:

如果答案为 YES,记 \(\operatorname{mid'}\) 为 \(\operatorname{mid} - n\) 的中点,询问集合 \([\operatorname{mid}, \operatorname{mid'}]\):

这时,如果答案为 YES,就可知道 \(x\) 必不在 \([\operatorname{mid'}, n]\) 当中。

对于其他情况类似讨论一下即可,我们用两次询问缩小了 \(\frac{1}{4}\) 的范围。
此时又出现了一个 bug,当范围缩小至 \(n = 3\) 时怎么做?这就有点难了,设三个数分别为 \(a_1, a_2, a_3\),具体步骤如下:
- 询问集合 \(\{a_1, a_2\}\),
- 如果回答是
NO,那么我们就认为 \(x = a_3\),提交一次答案,- 如果猜中了,游戏结束。
- 如果猜错了,我们的范围就缩小至 \(\{a_1, a_2\}\) 中。同时,我们知道上一次的回答在
Joking,下一次询问就必定会说真话!接下来就很容易了,询问集合 \(\{a_1\}\) 便能知道 \(x\),提交答案,游戏结束。
- 如果回答是
YES,请继续向下看,
- 如果回答是
- 再次询问集合 \(\{a_1, a_2\}\),
- 如果回答是
NO,同上处理,不再赘述。 - 如果回答是
YES,由 \(\operatorname{Observation 2}\) 可知 \(x \neq a_3\),于是我们的范围缩至了 \({a_1, a_2}\)!依次提交 \(a_1\)、\(a_2\) 作为 \(x\) 即可。
- 如果回答是
注意要特判 \(n = 1\),不然会 WA on #2。
CF1746F - Kazaee *2800
神题。考虑给每个数赋一个随机值,准确来说是把每一个相同的数随机映射成另一个数,可以发现:
- 若区间内所有数的出现次数都为 \(k\) 的倍数,那么和也必定是 \(k\) 的倍数。
- 若区间内所有数的出现次数不为 \(k\) 的倍数,和也有可能是 \(k\) 的倍数。不过均摊下来,错误率大概只有 \(\frac{1}{k}\) 左右。
使用树状数组维护即可。思考正确性:\(k\) 等于 \(1\) 时必定都为 YES,所以只需考虑 \(k \geq 2\) 的情况。可以随机映射 \(30\) 次,这样错误率最多只有 \(\frac{q}{2^{30}}\) 左右,可以通过。
具体实现上,如果使用 map 进行映射会被卡常。我的解决方案是写关于 \(x\) 和映射到的数 \(T\) 的一个伪随机式子,可以达到相同的效果。
实测可以每次随机时取一个数 \(arg\),对于每个数取 \(T = arg^{a_i}\),这样复杂度就是 \(O(kn \log n)\),其中 \(k = 30\)。
这样做仍然被卡常了!所以可以先对 \(a_i\) 离散化,这样算幂的时候就不用快速幂了,直接预处理即可。复杂度仍然是 \(O(k n \log n)\),不过这时瓶颈在于树状数组而不是快速幂了,常数很小,跑得飞快。
题外话:CSP 前没补这题,结果 CSP T3 就考到了与这题 几乎完全一致 的解法,亏大了 /ll
CF1747D - Yet Another Problem *1900
分类讨论题,和 CSP-S 2022 T2 有的一拼。
- 如果区间内全为 \(0\),则答案为 \(0\)。
- 如果区间 \(\operatorname{xor}\) 不为 \(0\),则答案为 \(-1\)。
- 其余情况中,如果区间长度为奇数,则答案为 \(1\)。
- 其余情况中,如果 \(a_l = 0\) 或 \(a_r = 0\),则答案为 \(1\)。
- 其余情况中,存在 \(i \in [l, r]\),使得区间 \([l, i]\) 符合题目中的条件,则答案为 \(2\)。
- 其余情况中,答案为 \(-1\)。
如果暴力模拟复杂度是 \(O(nq)\),瓶颈在第五步,需要优化。
考虑对前缀和(或者叫前缀 \(\operatorname{xor}\) ?)排序,把相同的位置拎出来,预处理对于每个位置 \(i\),使 \([i, j]\) 满足条件的最小的 \(j\),就可以达到 \(O(n \log n + q)\) 的优秀复杂度,可以通过。
CF1753C - Wish I Knew How to Sort *2000
\(\operatorname{Key Observation}\):设序列中 \(0\) 的数量为 \(\operatorname{cnt}\),只有前 \(\operatorname{cnt}\) 位中的 \(1\) 和后 \(n - \operatorname{cnt}\) 位中的 \(0\) 交换 有意义。
然后瞎 dp 就行啦。我们设 \(\operatorname{dp}_i\) 表示形成前 \(\operatorname{cnt}\) 位中有 \(i\) 个 \(0\) 的期望步数,可以推出转移方程:
CF1753D - The Beach *2400
比较套路的最短路。
考虑把太阳椅的移动看作空格子的移动,可以按如下方式建图:
- 如果 \(s_{i, j} = \operatorname{L}\),则 \((i, j+2) \rightarrow (i, j)\),\((i+1, j+1) \rightarrow (i, j)\),\((i-1, j+1) \rightarrow (i, j)\);
- 如果 \(s_{i, j} = \operatorname{R}\),则 \((i, j-2) \rightarrow (i, j)\),\((i+1, j-1) \rightarrow (i, j)\),\((i-1, j-1) \rightarrow (i, j)\);
- 如果 \(s_{i, j} = \operatorname{U}\),则 \((i+2, j) \rightarrow (i, j)\),\((i+1, j+1) \rightarrow (i, j)\),\((i+1, j-1) \rightarrow (i, j)\);
- 如果 \(s_{i, j} = \operatorname{D}\),则 \((i-2, j) \rightarrow (i, j)\),\((i-1, j+1) \rightarrow (i, j)\),\((i-1, j-1) \rightarrow (i, j)\);
然后跑最短路就行了。时间复杂度 \(O(nm \log (nm))\)。
CF1761D - Carry Bit *2100
纯组合计数题。我们把连续的进位看成一段,考虑枚举总段数 \(i\)。经过计算,我们可以发现选取不同进位位置的方案 \(ans = {k-1 \choose i-1} \times {n-k+1 \choose i}\)。每个位置可以取怎样的数值呢?容易发现一次进位需要一个 \(\begin{matrix} 1 \\ 1 \end{matrix}\) 开始,连续进位过程种每个位置不能是 \(\begin{matrix} 0 \\ 0 \end{matrix}\),连续进位后需要一个 \(\begin{matrix} 0 \\ 0 \end{matrix}\) 来结束进位(除非最后一次进位是在第 \(n\) 位),其余位置不能是 \(\begin{matrix} 1 \\ 1 \end{matrix}\)。于是可以分类讨论:
-
\(k + i - 1 \geq n\):此时最后一次进位必定在第 \(n\) 位,故答案需要加上 \(ans \times 3^{n-2i+1}\)。
-
\(\operatorname{Otherwise}\):此时最后一次进位不在第 \(n\) 位的方案 \(num = {k-1 \choose i-1} \times {n-k \choose i}\),所以答案要加上 \((ans - num) \cdot 3^{n-2i+1} + num \cdot 3^{n-2i}\)。
CF1761E - Make It Connected *2400
考虑按连通块的个数与特征分类讨论:
-
如果图中只有一个连通块,也就是说图已经连通,答案为 \(0\)。Proof:显然。
-
其余情况中,如果存在度数为 \(0\) 的点,答案为 \(1\)。Proof:显然。
-
其余情况中,如果存在一个连通块不是完全图,答案为 \(1\)。Proof:任意选择一个度数不为 \(k-1\) 且不为割点 的结点执行操作即可,其中 \(k\) 为所在连通块大小。
-
其余情况中,如果途中存在大于等于 \(3\) 个连通块,答案为 \(2\)。Proof:任意选择两个来自不同连通块中的点执行操作即可。
-
其余情况中,答案为 \(2\) 个连通块中较小连通块的大小。Proof:容易发现只有对某一连通块内所有点依次执行操作后才能满足条件。

浙公网安备 33010602011771号