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 时只需保证笼子不穿过好路径即可。

posted @ 2025-05-26 12:03  zxh923  阅读(110)  评论(0)    收藏  举报