第五次 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$ 即可。
posted @ 2023-07-25 16:33  Jijidawang  阅读(13)  评论(0)    收藏  举报  来源