第五次 ABC
警惕卡常 -90
A
设 $d_u$ 表示 $u$ 到根的距离。
令 $f_u$ 表示 $u$ 有一个士兵,根有无数个士兵时占领 $u$ 子树的代价。
发现最优方案下一定有士兵留在 $u$ 子树内,设方案最优的前提下留下的士兵到 $u$ 的距离至少为 $g_u$。
先假设 $u$ 往其每个孩子 $v$ 都派了一个士兵,此时占领 $u$ 子树的代价为 $\sum(f_v+1)$。
考虑往每个孩子 $v$ 派士兵的代价:
- $g_v+1<d_u$:占领 $v$ 后走 $g_v+1$ 返回 $u$ 的方案优于从根派一个士兵走 $d_u$ 到达 $u$ 的方案,代价为 $g_v+1$,称其为 $\mathbf I$ 类儿子。
- $g_v+1\ge d_u$:从根派一个士兵走 $d_u$ 到达 $u$ 的方案优于占领 $v$ 后走 $g_v+1$ 返回 $u$ 的方案,代价为 $d_u$,称其为 $\mathbf{II}$ 类儿子。
则 $\mathbf{II}$ 类儿子的士兵都会留在 $u$ 子树内,取其中 $g_v+1$ 最小的一个作为 $g_u$ 即可。
注意无需统计代价最大的儿子,因为 $u$ 上本来就有一个士兵。
B
最大值最小,二分。设二分到 $m$,考虑 check。
网格图看成 $rc$ 个点,先把每个点加入优先队列。
每次取出一个值最大的点,则可以确定这个点的最终值为该值,
用该值更新其相邻点的值,将它们加入优先队列。
最终值与原值之差之和不超过 $k$ 即合法。
其实就是差分约束,负数最长路用 Dijkstra 跑。
C
仨 $\log$ 非正解(
拆成前缀相减,以算 $L,R$ 内前 $a$ 大的数之和为例。
枚举 popcount,确定第 $a$ 大的数的 popcount 为 $k$。
设 popcount $>k$ 的数有 $z$ 个,二分出 popcount 为 $k$ 的第 $a-z$ 大数即可。
容易数位 DP 维护,常数小可以过。
卡常寄巧(一个不用只有 $10$ 分捏):
- 定义状态为 $f_{i,j}$ 表示填到 $i$ 位,还需要填 $j$ 个 $1$(而非“已经填了 $j$ 个 $1$”),这样不需要每次
memset。 - 枚举 popcount 时只枚举到 $\log_2 R+1$ 即可。

浙公网安备 33010602011771号