【笔记】IOI2022
「IOI2022」鲶⻥塘
签到题。
如果我们记 \(a_i\) 表示第 \(i\) 列的高度,那么一定不存在 \(a_i\ge a_{i +1}\le a_{i+ 2}(a_{i+1} \neq 0)\) 的情况,假设存在,我们将 \(a_{i + 1}\leftarrow 0\) 答案不会更劣。同理如果 \(a_i\le a_{i + 1} \ge a_{i + 2}\),我们就将 \(a_{i + 1}\) 取到最大值。
对于对于每个非 \(0\) 段都是单峰的,这样我们就可以简单 DP,\(f/g\) 表示到了哪一个,现在是增还是减的最优值。
,
此时复杂度还是 \(\mathcal{O}(N^2)\),注意到对于每一列一定是修到顶或者修到某个鱼前面停止,所以状态可以优化到 \(\mathcal{O}(M)\),剩下的直接DP 就行。
「IOI2022」囚徒挑战
非常有意思的交互题。
我们比大小,直接二进制拆分从高位到低位比较,优化一下顺序即可做到 \(2\log n = 26\),同时三进制拆分可以做到 \(3\log_3 n = 24\)。由于题目保证两个数不相同,二进制拆分做法的最后两次是不需要比较的,也可以做到 \(24\) 次。
后面的方法是我没想到的,我们可以同时混用二进制和三进制。相当于每次将 \(n\) 等分成 \(k\) 份,然后递归下去。这样我们可以列出 DP 方程,\(f_n = \min\{k + f_{n/k}\}\),同时如果这个人看到的数是 \(1\) 或者是 \(n\) 可以直接结束,所以是 \(f_n = \min\{k + f_{(n - 2)/k}\}\),卡卡常就能过去了。
「IOI2022」⽆线电信号塔
前 \(4\) 个子任务非常简单。其余待补。
「IOI2022」数字电路
这题竟然是 IOI2022 通过人数最多的题,不过我愣是瞪了两个小时没想出来。
这题的关键在于组合意义,对于一个阈值门,如果它有 \(k\) 个儿子是 \(1\),那么它就有 \(k\) 种取值,组合意义是对于每个为 \(1\) 的阙值门,选则一个为 \(1\) 的儿子与之配对。
那么我们就可以直接算贡献了,相当于固定一条从叶子到根的路径,路径之外随便填即可。这样每个输入门之间独立,简单 DFS 可以求出每个叶子对根的贡献,然后线段树维护区间操作即可。
「IOI2022」最罕见的昆虫
个人认为这是最简单的一题。
我们将所有数扫一遍,始终保持最大出现次数为 \(1\),这样可以得到颜色数 \(c\)。
由于我们询问得到最大值,要求最小值,显然是二分。我们二分 \(mid = \left\lfloor\frac{n}{k}\right\rfloor / 2\),将所有数扫一遍,始终保持最大出现次数 \(\le mid\)。最后如果在机器里的数 \(=mid\times c\),说明 \(ans \ge mid\),否则 \(ans < mid\)。
如果 \(ans\ge mid\),直接将机器里的数全部删掉,否则将机器外的数全部删掉,然后递归下去,每次 \(n\) 都会减半。次数是 \(f(n) = n + f(n / 2) \approx2n\),然后算上最开始扫一遍的 \(n\) 次。同时这题需要一些常数优化的技巧。
「IOI2022」千岛
对于任意 \(u\to v\) 存在 \(v\to u\) 的 sub,找到一个分叉即可构造答案,即 \(1-x,x-y,x-z\),\(x\) 可以等于 \(1\)。
对于任意 \(u\to v\) 存在另一条 \(u\to v\) 的 sub,我们只用找到一个环,正着走两遍,再倒着走两遍即可。
对于所有测试点,核心思路是找到两个环然后构造答案,需要讨论各种 case,细节没想清楚,回头再补。