专栏文章

CF2152H2 Victorious Coloring (Hard Version)

CF2152H2题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minnlput
此快照首次捕获于
2025/12/02 05:20
3 个月前
此快照最后确认于
2025/12/02 05:20
3 个月前
查看原文
先考虑已知 xix_i 怎么求 f(xi)f(x_i)。设 aua_uuu 头上的边,朴素的想法是直接 dp,dpu=au+vmin(dpvav,av)dp_u = a_u + \sum\limits_v \min(dp_v - a_v, a_v),然后对 llmax\max,但是这个做法无法优化,故舍去。
先对原图找一点性质:对于最小的连通块,不存在一条内部到外部的边 wiw_i 比内部任意一条边的 wjw_j 大,否则可以让内部那条 wj<wiw_j < w_ijj 作为内部到外部的边。所以从大往小加边,那么就只有每次加完边的连通块和一开始的孤点可能成为 f(xi)f(x_i)
考虑求答案,设 sum(S)sum(S) 为联通块 SS 的内部到外部边权和,ansSans_SSS 内部的 xx 之和,显然要有 S,ans(S)lsum(S)\forall S,ans(S) \ge l - sum(S)
容易发现,上面的连通块可以通过 kruskal 重构树来表示,每个连通块就是一个子树,那么就有 ansu=max(anslsu+ansrsu,lsum(u))ans_u = \max(ans_{ls_u} + ans_{rs_u}, l - sum(u))
考虑直接维护 ansu(l)ans_u(l) 为关于 ll 的一个函数。
  • 对于叶子节点,ansuans_u 为一段 00 后加上一条斜率为 11 的直线,显然是凸的。
  • 对于非叶子节点,ansuans_u 可以表示为两个凸函数之和和一个凸函数取 max,还是凸的。
用 slope trick 维护这个凸函数,合并两个子树的时候直接把两个堆 merge,取 max 的时候只用看最小的若干个点被一条斜率为 11 的直线弹掉即可,每次只会加 O(1)O(1) 个点。
所以复杂度为 O(nlog2n+qlogn)O(n\log^2 n+q\log n)O((n+q)logn)O((n+q)\log n),取决于是否使用可并堆。

评论

0 条评论,欢迎与作者交流。

正在加载评论...