11月23日训练赛题解
预期难度排序:GHDCBFEA
A
我们可以将式子中的 \(i\) 看作物品,\(a_{i}\) 看作个数,那么问题就转化为了一个带限制条件的背包问题。
需要用到一个经典 \(trick\):后缀背包。
顾名思义,就是将一个序列的每一个后缀看作是一个物品,每一次只能取某个完整的后缀。
这样做有什么好处呢?可以发现:对于上述的任何一种选择方案,我们一定能够保证 \(a_{1} \leq a_{2} \leq ... \leq a_{n}\),几乎完美符合了题中 \(a_{i}\) 必须严格单调递增这一限制条件(实际上不应该有取等)。
那应该如何处理取等?也非常简单:将每个后缀都预先强制选择一个就行了,因为 \(a_{i}\) 必须 \(\geq i\),上述的强制选择又等价于选择了 \(i\) 个 \(i\)。剩下的选择就比较自由了:每次可以无限制地选取 \(1\) 到 \(n\) 的某个后缀,相当于对所有的后缀做完全背包。由于要构造 \(a_{1}...a_{n}\),需要在跑背包的过程中记录选择方案。具体实现见std。
B
首先不难想到贪心:按照从高到低的顺序考虑每个二进制位。假设当前考虑到了第 \(bit\) 个二进制位(权值对应 \(1<<bit\))。如果:
即可将第 \(bit\) 个二进制位均填 \(1\),进而得到了 \(1<<bit\) 的贡献。
那么若遇到另一种情况,即 \(n < m * (1<<bit)\) 时,应当如何填充?这是本题的关键。
很容易地去想:避免浪费,该位全填 \(0\) 不就好了?这个想法是错误的。因为这并不是我们想全填 \(0\) 就能全填 \(0\) 的。当有以下关系时:
事情便不会如我们所愿,因为当该位的后面已经全部填充了 \(1\) 后,还会剩下一些数字。此时无论填哪个数,都会存在进位,那么该位无论如何也不能做到全 \(0\),也就是该位必然出现 \(1\)。
假设该位共有 \(k\) 个 \(1\),那么贪心地想,既然该位不可能做到全 \(1\),那么该位 \(1\) 的数量应当越少越好,这样就可以最大化后面低位的贡献。于是我们可以最小化 \(k\) 的值,直至该位可以不产生进位,也就是:
化简后得到:
而若 \(n \leq m * ((1<<bit)-1)\),那么该位就可以是全 \(0\),此时就可以本着“不浪费”的原则直接看下一位。至此全部情况已分析完毕。具体细节见std。
C
一个很显然的贪心:成功概率大的 \(b_{i}\) 分配给更大的数一定更好。因此可以将 \(b\) 升序排序,并按照 \(1,1,2,2,...,n,n\) 的顺序依次分配 \(b_{i}\)。于是我们将问题分成了 \(2n\) 个相互独立的相同子问题,子问题的形式:将 \(0\) 经过题述操作变成 \(x\),操作次数的期望。
定义 \(dp_{x}\):在成功概率为 \(b_{i} \%\) 时,将 \(x-1\) 变为 \(x\),操作次数的期望。
状态转移分两种情况:
- 第一次操作成功:概率 \(b_{i} \%\),共需要一次操作。
- 第一次操作失败:概率 \(1 - b_{i}\%\),操作后又分两种情况:
- \(x=1\) \(\Rightarrow\) 无变化,当前值仍为 \(x-1\):
- \(x>1\) \(\Rightarrow\) 失败后当前值变为 \(x-2\) \(\Rightarrow\) 需要先变为 \(x-1\),再变为 \(x\):
化简即可得到 \(dp_{x}\)。
以 \(b_{i} \%\) 的成功概率将 \(0\) 变成 \(x\) 需要的操作总次数:\(\sum_{i=1}^{x} dp_{i}\)。
由于 \(b_{i}\) 只有 \(100\) 种取值,我们只需要对所有可能的 \(b_{i}\) 分别求其相应的 \(dp_{x}\) 就可以了,复杂度 \(O(100n)\)。
D
本题的做法不唯一,这里写一下个人认为比较巧妙的做法。
显然对于长度为 \(n\) 的双排列,\(n\) 一定是偶数,并且 \(1\) 到 \(\frac{n}{2}\) 均出现两次。考虑用异或哈希来判断这件事情:将序列中所有出现过的数映射到一个随机的大哈希值,然后对于某个数 \(x\),在原序列中 交替 地为其赋上相应的哈希值(比如对于序列中第奇数次出现的 \(x\) 赋哈希值,第偶数次出现的 \(x\) 赋 \(0\)),并求前缀异或和。再预处理出 \(1\) 到 \(n\) 的哈希值的前缀异或和 \(pre\)。那么,\(a[l \backsim r]\) 是双排列,当且仅当 区间长度为偶数 && 所有数均出现偶数次 && 区间异或和等于 \(pre_{\frac{r-l+1}{2}}\)。
证明:二者的异或值相等可以说明 \(a[l \backsim r]\) 内值的集合为 \(\{1,2,...,\frac{r-l+1}{2}\}\);并且每个数一定出现了偶数次,序列长度是 \(r-l+1\),且已经确定了恰好有 \(\frac{r-l+1}{2}\) 种数,由上述三个条件,不难确定这样的序列只有一种,就是 \(1 \backsim \frac{r-l+1}{2}\) 的双排列。证毕。
每次查询 \(O(1)\) 判断即可,实现细节见 std。
E
由于规定了元素两两不同,每个元素一定存在唯一对应的目标位置。先将每个元素的原始位置和目标位置预处理出来。
考虑将任意一对差值恰为 \(k\) 的数归到一个分组中(不需要 \(O(n^{2})\) 暴力着做,按照 \(std\) 的方式,按序依次对每个数 \(x\) 找 \(x + k\),\(x + 2k\)...就可以了,最多找 \(n\) 次)。这样就得到了若干个按照 \(|a_{i} - a_{j}| = k\) 划分的分组,显然分组内的元素是可以任意作交换的。
将所有位置按照模 \(k\) 分成 \(0 \backsim k - 1\) 共 \(k\) 个等价类。对于上述每个分组,看分组内每个数的原始位置等价类集合和目标位置等价类集合是否相同。如果不同,就一定存在某些目标位置等价类分配不到它需要的数。
(举个栗子:\(k = 3\),某个分组的原始位置等价类集合为 \(\{0,1,1\}\),目标位置等价类集合为 \(\{1,1,2\}\),那么无论怎么交换,目标位置等价类为 \(2\) 的那个数最终一定不会分配到等价类为 \(2\) 的位置,因为只能在 \(0,1\) 里选)
如果对于所有分组,其原始位置等价类集合与目标位置等价类集合都是相同的,就一定可行。因为我们只需要对于每个分组,将每个数分配到其对应的目标位置等价类上,然后对每个等价类作排序就可以了。具体实现见 \(std\)。
F
先考虑 \(x=0\) 的情况:对于任何包含 \(0\) 的区间一定不符合题意,而对于任何不包含 \(0\) 的区间,由于 \(P\) 是质数,\(1 \leq a_{i} < P\),显然 \(\prod_{i=l}^{r}a_{i}\) 不可能是 \(P\) 的倍数,一定符合题意。因此这种情况只需要将 \(0\) 修改成任意非 \(0\) 值。
考虑 \(x \neq 0\):此时任何包含 \(0\) 的区间一定符合题意。贪心地想,将需要修改的数修改成 \(0\) 一定是最优解。
预处理原序列的前缀积数组 \(mul\),则原条件等价于:不存在 \(\forall 1 \leq l \leq r \leq n\),使得:
将上式转化一下:
\(inv(x)\) 是一个定值,因此我们可以枚举 \(r\) 并维护所有的 \(mul_{l-1}\),看是否存在某个 \(l\) 满足上式。若存在,则将 \(a_{r}\) 修改为 \(0\)(尽可能地修改右侧的值,可以让接下来待检验的左端点范围更小,显然更划算),并将左端点更新成 \(r+1\),重复检验过程即可。
G
本场签到题。贪心地让每次操作后的值最大化即可。对于 \(x\),其操作后的最大值只能是 \(\lfloor \frac{x-1}{2} \rfloor\),模拟整个过程,次数不会超过 \(\log n\)。
H
CF 通信场的一道题,放在这里是因为最近的沈阳区域赛已经开始出现通信题了,可见通信题会和交互题一样大概率成为未来赛场上的必考题,需要引起大家的重视。
本题比较特殊,通信内嵌套了交互,但难度不大。\(30\) 次询问,我们不难想到二分地问出来 \(n\) 的位置。由于每次可以询问出任意一个子区间的极差,且所求的就是最大值的位置,我们不妨从找到 \(1\) 和 \(n\) 位置的角度入手。有一个不错的性质:询问结果为 \(n-1\),当且仅当区间内同时包含 \(1\) 与 \(n\),我们可以利用这个性质来构造二段性。具体地:固定查询左端点为 \(1\),二分右端点,找到第一个询问结果为 \(n-1\) 的位置,显然这个数一定是 \(1\) 和 \(n\) 中的某一个;固定右端点为 \(n\) 并二分左端点也同样可以得到另一个位置。
那么如何知道 \(n\) 具体在这两个位置中的哪一个呢?这就需要利用通信题的特性了。不要忘了,第一次运行程序时,\(A\) 是可以向 \(B\) 传递一个数字 \(x = 0/1\) 的。对于上述两种询问方式,我们不难发现第一种问出的是 \(1\) 和 \(n\) 中靠右侧的那个数的位置,第二种问出的是 \(1\) 和 \(n\) 中靠左侧的那个数的位置。于是我们恰好可以利用这个 \(x\) 来表示原序列中 \(1\) 和 \(n\) 的相对位置关系,进而决定采用两种询问方式中的哪一个。具体实现见 \(std\)。

浙公网安备 33010602011771号