CF2109 题解
A. It's Time To Duel
考虑连着的两个人不可能都是 \(0\),也不可能所有人都是 \(1\)。
B. Slice to Survive
首先行和列是独立的。然后注意到,我可以先把这个点在某一维上卡到两个半边之一,另一维这个点就一定在中点的位置了。
注意到如果当前某一维上这个点在一个长度为 \(l\) 的边界内,那么一次操作后 \(l\rightarrow \lceil\dfrac{l}{2}\rceil\),然后两维加起来就好了。
C1. Hacking Numbers (Easy Version)
先做两次 digit,然后 \(x\) 被缩到了 \(1\sim 16\) 内,直接减去 \(8,4,2,1\) 再加上 \(n-1\) 即可。
C2. Hacking Numbers (Medium Version)
发现瓶颈在于后面的四次减操作。考虑一开始先乘上 \(9\),然后做两次 digit。不难发现此时 \(x\) 是 \(9\),于是直接加上 \(n-9\) 即可。
C3. Hacking Numbers (Hard Version)
首先我们发现在上一题中,我们没有用到上界是 \(10^{18}\) 的要求。于是我们考虑怎么用上。
我们可以直接乘上 \(10^9-1\),再做一次 digit。自己手玩一下可以发现这是得到的一定是 \(81\),然后就做完了。
D. D/D/D
发现可以通过反复横跳的方式消掉 \(2\) 步。于是我们找出最多能走多少(奇数)偶数步,然后找出起点到终点最短要走多少奇数(偶数)步,比较一下即可。
E. Binary String Wowee
注意到一个位置的值只跟他后面的位置操作了多少次有关,于是我们考虑倒着 dp。
设 \(f_{i,j}\) 表示后 \(i\) 个数操作了 \(j\) 次的方案数,考虑枚举从后往前第 \(i+1\) 个数做了 \(l\) 次操作,不难发现把两边合并起来的方案数是 \(\binom{\lfloor\frac{j+l+[s_i=0]}{2}\rfloor}{l}\),然后答案就是 \(f_{1,k}\)。
F. Penguin Steps
首先用二分+并查集求出 dism。
然后我们二分 disf。显然我们需要建造一个类似笼子的东西,使得 \((n,1)\) 与终点不连通,这个笼子由八连通的 \(\ge mid\) 的格子组成。
接着分类讨论一下:
-
\(mid\le dism\):那么只要能隔开 \((n,1)\) 与终点就行了,这个直接跑多源 dijkstra就行。
-
\(mid>dism\):在隔开 \((n,1)\) 的基础上,不能穿过所有从 \((1,1)\) 到终点最短的路径。
我们认为一条路径是好的,当且仅当这条路径从 \((1,1)\) 到达终点的长度为 dism,且在 \((n,1)\) 那部分的格子数最多(因为根据直觉,留给下半部分的格子越多笼子越好建造)。
显然好路径只有一条,我们可以通过多源 bfs 求出,接下来做多源 dijkstra 时只需保证笼子不穿过好路径即可。

浙公网安备 33010602011771号