专栏文章

CF1179D题解

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

文章操作

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

当前评论
0 条
当前快照
1 份
快照标识符
@miog6tk9
此快照首次捕获于
2025/12/02 18:41
3 个月前
此快照最后确认于
2025/12/02 18:41
3 个月前
查看原文
先考虑一棵基环树上有多少条简单路径,设环上有 numnum 个点,环上第 ii 个点的子树内共有 aia_i 个点。有
ans=i=1num12ai×(ai1)+(ai×(nai))=2n2n212i=1numai2\begin{aligned} ans &= \sum _{i=1} ^{num} \frac{1}{2} a_i \times (a_i -1)+(a_i \times (n-a_i)) \\ &=\frac{2n^2-n}{2}-\frac{1}{2}\sum _{i=1} ^{num} a_i^2 \end{aligned}
要最大化 ansans ,就要最小化 i=1numai2\sum _{i=1} ^{num} a_i^2 ,记为 retret
在原树中,两个点之间连一条边,这条新边就和两个点之间的简单路径形成了一个环,我们称该路径被这条新边覆盖了。对于一个被覆盖的点它既不是叶子节点,也不是新边两端点的LCA,那么它一定能向下扩展一个节点直到叶子节点,使得答案更优,这不难理解。也就是说,连的新边的两个端点一定是树上的叶节点(度为1的点)。
fif_i 表示从非 ii 的子树中的一个点向 ii 的子树中的一个点连边,只考虑 ii 的子树造成的贡献的最小值,即此时点 uu 一定被覆盖,且恰有一个儿子被覆盖。于是对于非叶子节点 uu ,有
fu=minv{fv+(sizusizv)2}f_u=\min _v \{ f_v+(siz_u-siz_v)^2 \}
其中 sizusiz_u 表示点 uu 的子树大小。特别地,对于叶子节点 uu ,有 fu=1f_u=1
有了 ff 数组后,考虑如何合并答案,对于点 uu ,当 uu 为新边的两端点的LCA时,我们可以朴素地枚举 uu 的两个儿子 xxyy ,表示两端点分别在 xxyy 的子树内,此时的贡献为
ret=fx+fy+(nsizxsizy)2ret=f_x+f_y+(n-siz_x-siz_y)^2
这样做的时间复杂度是 O(n2)O(n^2) 的,不能通过。
将上式展开,有
ret=n2+fx2nsizx+sizx2+fy2nsizy+sizy2+2sizxsizyret=n^2+f_x-2nsiz_x+siz_x^2+f_y-2nsiz_y+siz_y^2+2siz_xsiz_y
发现可以套用斜率优化。具体地,将点 uu 的儿子按 sizsiz 从小到大排序,枚举 xx ,用单调队列维护一个下凸壳 。
然后就做完了。

评论

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

正在加载评论...