4/20 - CPS-S 模拟
与众不同。
复盘
(具体题目信息详见后文解析)
怀着复杂的心情打开了 A,为什么是数学题。
计算模拟了一下,题目可以抽象成构造一个 \(1\) 到 \(n\) 的排列,第 \(i\) 个数配上一个权值 \(\frac{1}{2^i}\),特别的,第 \(n\) 个值为 \(\frac{1}{2^{n - 1}}\),求最大的和。
然后这就可以贪心了,发现了直接 \(n\) 到 \(1\) 就最优秀,直接 \(\mathcal{O} (n)\)。
但是要分数取模,非常愤怒,直接跳过。
看 B,不是,什么东西?
看错题了来着。
跳过,看 C。
发现 C 可以直接 \(\mathcal O(n \log_3n)\) 预处理出所有好数,然后二分一下输出。
拿下 \(100\)。
一直认为 D 是不可做题,打了 \(30\) 暴力就返回去看 A。
仔细琢磨了一下,发现 \(10^9 + 7\) 是一个质数,而分数取模好像可以直接用逆元解。
迎刃而解了啊!
恭喜你得到了 \(70\) 分(理论上是 \(80\) 分来着)。
然而我并没有看见数据范围。
- 预估:\(80 + 100 + 100 + 30 = 310\)。
- 实际:\(70 + 100 + 100 + 30 = 300\)。
挂分了呜呜呜。
解析
A
输入 \(n\),求一个排列,每次将前两个数的平均值替换成前两个数,求最后剩下的最大和。
设当前排列为 \(s\)。
则答案为:
因为每次 \(f\) 函数都要除以 \(2\),所以 \(f\) 越小越优秀。
即直接 \(s_i = i\) 是最优秀的。
通过数学归纳法可知:
分数取模:
B
一棵树,以路径上边权最小值为路径代价,求第 \(k\) 大的两点间最大路径代价。
克鲁斯卡尔建最大生成树,每次建边都统计一共有多少条路径。
因为当前出现过的所有路径都是比当前枚举到的 \(w\) 大的。
如果在加边之前没有超过 \(k\) 条,而加完之后超过了,就证明第 \(k\) 大的代价是 \(w\)。
C
所有三进制 \(1\) 与 \(2\) 个数相同的数为郝数,求 \(\ge n\) 的 \(m\) 个郝数。
预处理 + 二分。

浙公网安备 33010602011771号