1 条题解

  • 0
    @ 2025-8-24 21:57:49

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar immortalCO
    **

    搬运于2025-08-24 21:57:49,当前版本为作者最后更新于2018-02-10 20:30:44,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    T1T_1 进行边分治。每次分治的时候,考虑跨越中心边的两个所有路径。中心边将当前连通块分为左右两个连通块 LLRR。设点 ii 到中心边的距离为 d1(i)d_1(i),那么我们就是要找一对 iL,jRi\in L,j\in R,使得 $d_1(i) + d_1(j) + dist_{T_2}(i,j) + dist_{T_3}(i, j)$ 最大。

    建立 LRL\cup R 的关于 T2T_2 的虚树 T2T_2^{'},在虚树上进行 DFS。设点 iiT2T_2 上的带权深度为 d2(i)d_2(i)。在虚树上 DFS 到 pp 的时候,考虑所有在 T2T_2^{'} 中的 LCA 为 pp、且 iL,jRi\in L,j\in R 点对 (i,j)(i,j),求出 $d_1(i) + d_2(i) + d_1(j) + d_2(j) + dist_{T_3}(i,j) - 2d_2(p)$ 最大。其中最后一项和 i,ji,j 无关,可以省略。前三项可以看作是 (d1+d2)(i)+(d1+d2)(j)+distT3(i,j)(d_1+d_2)(i) + (d_1+d_2)(j) + dist_{T_3}(i, j),即可以认为是在 T3T_3 中,对每个点 ii 新建一个点 ii_{'},和 ii 连接边权为 d1(i)+d2(i)d_1(i) + d_2(i) 的边,求这棵树(称作 T3T_3^{'})中的满足 LLRR 包含条件的最长路径。

    由于边权非负,性质“集合合并后最长路的端点一定是两个集合各自的最长路端点中的两个点”成立,因此使用并查集来维护。记 fL/R(i)f_{L/R}(i) 表示 (i,j)(i,j) 都在 [T2T_2^{'}ii 的子树的点集交上 L/RL/R] 这个点集中时,在 T3T_3^{'} 中的最长路的两个端点,那么 fL/Rf_{L/R} 容易转移。同时由于边权非负,要求出一个端点在集合 AA 中、另一个在集合 BB 中的最长路,这条最长路的端点一定一个是 AA 的最长路的其中一个端点,另一个是 BB 的最长路的其中一个端点,因此就可以在 ii 和其子节点 jj 转移的时候,用 fL(i)f_{L}(i)fR(j)f_{R}(j) 组合更新答案,再用 fR(i)f_{R}(i)fL(j)f_{L}(j) 组合更新答案(注意在这里更新答案的时候要减去 2d2(i)2d_2(i))。

    这样这题就做完了。直接实现的话 O(nlog2n)O(n\log^2n),因为要求虚树和距离。如果强行优化的话可以优化成 O(nlogn)O(n\log n)(LCA 可以用 O(nlogn)O(n\log n) 预处理 O(1)O(1) 回答,虚树可以离线然后使用基数排序)。

    • 1

    信息

    ID
    3180
    时间
    4000ms
    内存
    500MiB
    难度
    7
    标签
    递交数
    0
    已通过
    0
    上传者