第五次 ABC

警惕卡常 -90

A

du 表示 u 到根的距离。

fu 表示 u 有一个士兵,根有无数个士兵时占领 u 子树的代价。

发现最优方案下一定有士兵留在 u 子树内,设方案最优的前提下留下的士兵到 u 的距离至少为 gu

先假设 u 往其每个孩子 v 都派了一个士兵,此时占领 u 子树的代价为 (fv+1)

考虑往每个孩子 v 派士兵的代价:

  • gv+1<du:占领 v 后走 gv+1 返回 u 的方案优于从根派一个士兵走 du 到达 u 的方案,代价为 gv+1,称其为 I 类儿子。
  • gv+1du:从根派一个士兵走 du 到达 u 的方案优于占领 v 后走 gv+1 返回 u 的方案,代价为 du,称其为 II 类儿子。

II 类儿子的士兵都会留在 u 子树内,取其中 gv+1 最小的一个作为 gu 即可。

注意无需统计代价最大的儿子,因为 u 上本来就有一个士兵。

B

最大值最小,二分。设二分到 m,考虑 check。

网格图看成 rc 个点,先把每个点加入优先队列。

每次取出一个值最大的点,则可以确定这个点的最终值为该值,

用该值更新其相邻点的值,将它们加入优先队列。

最终值与原值之差之和不超过 k 即合法。

其实就是差分约束,负数最长路用 Dijkstra 跑。

C

log 非正解(

拆成前缀相减,以算 L,R 内前 a 大的数之和为例。

枚举 popcount,确定第 a 大的数的 popcount 为 k

设 popcount >k 的数有 z 个,二分出 popcount 为 k 的第 az 大数即可。

容易数位 DP 维护,常数小可以过。

卡常寄巧(一个不用只有 10 分捏):

  • 定义状态为 fi,j 表示填到 i 位,还需要填 j1(而非“已经填了 j1”),这样不需要每次 memset
  • 枚举 popcount 时只枚举到 log2R+1 即可。
posted @   Jijidawang  阅读(7)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示