1 条题解

  • 0
    @ 2025-10-23 21:41:26

    题意理解

    我们有一棵 nn 个结点的有根树 T1T^1(根是 11 号结点)。 定义 TmT^m 的生成规则为:

    T1T^1 已知。

    TmT^m 是在 Tm1T^{m-1} 的每个叶结点下面连接一棵 T1T^1 的根结点(即把 T1T^1 复制一份,根接到 Tm1T^{m-1} 的每个叶子上)。

    要求 TmT^m 的直径(路径上的结点数)。


    1. 基本思路

    树的直径常用两次 BFS/DFS 求法:

    从任意点出发找到最远的点 uu

    uu 出发找到最远的点 vvuuvv 的路径就是直径。

    但这里 mm 可能很大(2×1052\times 10^5),TmT^m 的结点数会指数级增长,不能显式建树。

    我们需要找到 TmT^m 直径的递推规律。


    2. 符号与定义

    设:

    D(T)D(T) 表示树 TT 的直径(结点数)。

    h(T)h(T) 表示从根到叶子的最长路径的结点数(根深度为 11)。

    L(T)L(T) 表示从根到叶子的最长路径的结点数(其实 h(T)h(T) 就是这个)。

    F(T)F(T) 表示从根出发的最长路径的结点数(其实和 h(T)h(T) 一样)。

    M(T)M(T) 表示树中离根最远的结点到根的距离(结点数减 11 是边数,这里我们统一用结点数)。

    但更关键的是: 设 a(T)a(T) = 从根出发的最长路径长度(结点数), 设 b(T)b(T) = 树中任意两点之间的最长路径(即直径)。

    那么 a(T1)a(T^1) 就是 T1T^1 的根到最远叶子的结点数, b(T1)b(T^1) 就是 T1T^1 的直径。


    3. 递推分析

    3.1 从 Tm1T^{m-1}TmT^m TmT^m 的构造:在 Tm1T^{m-1} 的每个叶子下接一个 T1T^1 的根。

    那么:

    Tm1T^{m-1} 的叶子有 leaf(Tm1)leaf(T^{m-1}) 个。

    每个叶子下面挂一个 T1T^1,所以每个叶子所在的“位置”会多出 a(T1)a(T^1) 的路径(从该叶子到新子树中最远的叶子)。

    3.2 新直径的可能情况

    TmT^m 的直径可能出现在:

    完全在某个 Tm1T^{m-1} 内部:b(Tm1)b(T^{m-1})

    完全在某个新加的 T1T^1 内(不可能比情况 1 大,因为 b(T1)b(Tm1)b(T^1) \le b(T^{m-1})m2m\ge 2 时?不一定,要小心)。

    经过 Tm1T^{m-1} 的一部分和某个新加的 T1T^1 的一部分: 路径形如:在 Tm1T^{m-1} 中从结点 uu 到某个叶子 vv,然后进入该叶子下面的 T1T^1 到达其最深的叶子 ww。 这条路径长度 = [uv 在 Tm1中的距离]+a(T1)[u \to v \text{ 在 } T^{m-1} \text{中的距离}] + a(T^1)

    为了最大化这个,我们应取 Tm1T^{m-1} 中离 vv 最远的点 uu。 对于固定的 vv(它是 Tm1T^{m-1} 的一个叶子),离它最远的点可能是另一个叶子 vv',那么路径就是 Tm1T^{m-1} 的直径,但这样 vvvv' 都是叶子,它们之间的路径不经过新加的子树,所以不进入 T1T^1,这其实是情况 1。

    我们要进入新子树,必须让路径的一端在新子树中。 所以考虑: 路径一端在某个新加的 T1T^1 的最深叶子 PP,另一端在另一个新加的 T1T^1 的最深叶子 QQ(或 Tm1T^{m-1} 中的某个点)。

    3.3 更清晰的分解

    设:

    d1d_1 = Tm1T^{m-1} 的直径长度。

    HH = Tm1T^{m-1} 中从根到叶子的最大结点数(即高度,根为 1 层)。

    h1h_1 = T1T^1 中从根到叶子的最大结点数(高度)。

    TmT^m 的直径可能为:

    d1d_1(完全在 Tm1T^{m-1} 内部)。

    路径从 Tm1T^{m-1} 中某个点 xx,走到某个叶子 yy,然后进入该叶子的 T1T^1 到达其最深叶子:长度 = distTm1(x,y)+h1\mathrm{dist}_{T^{m-1}}(x, y) + h_1。 对固定的 yy,最大化 dist(x,y)\mathrm{dist}(x,y) 就是找 Tm1T^{m-1} 中离 yy 最远的点,这个最大值是 d1d_1 吗?不一定,因为 yy 是叶子,离它最远的点可能是另一个叶子,距离就是 d1d_1,但这样 xx 也是叶子,路径完全在 Tm1T^{m-1} 中,不加 h1h_1。 所以我们要让 xx 在另一个新子树中:即路径穿过 Tm1T^{m-1} 连接两个不同的新子树。

    3.4 跨两个新子树的路径

    考虑 Tm1T^{m-1} 中两个不同的叶子 uuvv,它们下面各挂了一个 T1T^1。 路径:从 uu 下面的 T1T^1 的最深叶子 AA,到 vv 下面的 T1T^1 的最深叶子 BB。 长度 = h1+distTm1(u,v)+h1h_1 + \mathrm{dist}_{T^{m-1}}(u,v) + h_1

    那么 distTm1(u,v)\mathrm{dist}_{T^{m-1}}(u,v) 最大是多少? uuvv 是叶子,它们的距离等于 $depth[u] + depth[v] - 2\times depth[\mathrm{lca}(u,v)]$。 为了最大化它,我们取 Tm1T^{m-1} 中深度最大的两个叶子,且它们的 LCA 是根(即在不同分支上)。 实际上,Tm1T^{m-1} 中两个叶子的最大距离就是 d1d_1 吗? 不一定,因为 Tm1T^{m-1} 的直径端点不一定是叶子? 不,树的直径端点一定是叶子(除非只有一个结点)。所以是的,直径端点就是两个叶子。

    所以 maxdistTm1(u,v)=d1\max \mathrm{dist}_{T^{m-1}}(u,v) = d_1

    因此这种情况的长度 = d1+2h11d_1 + 2 h_1 - 1? 不对,检查: AAuuh11h_1 - 1 条边? 我们用的是结点数。 AAuuTmT^m 中的结点数 = h1h_1(因为 uuT1T^1 的根的父亲? 等等,构造是:Tm1T^{m-1} 的叶子 uu 下面接 T1T^1 的根 rr,所以 uurr 有一条边,rr 到最深叶子 AAh11h_1 - 1 条边,所以 uuAAh1h_1 个结点? 不对,uuAA:路径 urAu \to r \to \dots \to A,结点依次是 u,r,,Au, r, \dots, A,总数为 1+(h1)=h1+11 + (h_1) = h_1 + 1? 我们算一下:

    T1T^1 的高度(结点数)是 h1h_1,即从根到最深叶子有 h1h_1 个结点。 现在 T1T^1 的根 rr 接在 uu 下面,所以 uuAA 的结点数 = 11 (u) + h1h_1 (从 rrAA) = h1+1h_1 + 1? 不对,这样重复计算了 uurr 吗? 我们明确一点:

    T1T^1 内部:根 rr 到最深叶子 AAh1h_1 个结点。 现在 uuTm1T^{m-1} 的叶子,uurr 连边,所以 uuAA 的路径:u,r,,Au, r, \dots, A,结点数 = 1+h11 + h_1? 不对,因为 rrAAh1h_1 个结点,其中 rr 是第一个,AA 是最后一个。所以 uuAA 的结点数 = 11 (u) + h1h_1 (r到A) = h1+1h_1 + 1

    同理 vvBB 也是 h1+1h_1 + 1 个结点。

    那么 AABB 的路径:$A\to \dots \to r_u \to u \to \dots \to v \to r_v \to \dots \to B$。 结点数 = $(h_1) + [u \to v \text{ 在 } T^{m-1} \text{ 中的结点数}] + (h_1)$。 但 uvu\to vTm1T^{m-1} 中的结点数 = distTm1(u,v)+1\mathrm{dist}{T^{m-1}}(u,v) + 1(边数+1)。 所以总结点数 = h1+(distTm1(u,v)+1)+h1h_1 + (\mathrm{dist}{T^{m-1}}(u,v) + 1) + h_1 = 2h1+distTm1(u,v)+12 h_1 + \mathrm{dist}_{T^{m-1}}(u,v) + 1

    distTm1(u,v)=d11\mathrm{dist}{T^{m-1}}(u,v) = d_1 - 1(因为 u,vu,v 是直径端点,它们之间的距离是 d11d_1 - 1 条边? 等等,之前混淆了:d1d_1 是直径的结点数,边数 = d11d_1 - 1。 那么 distTm1(u,v)\mathrm{dist}{T^{m-1}}(u,v) 的结点数 = d1d_1(因为路径上的结点数就是 d1d_1)。 所以 AABB 结点数 = 2h1+d12 h_1 + d_1

    3.5 另一种情况

    可能直径是一个端点在 Tm1T^{m-1} 内部(非叶子),另一个端点在新子树的最深叶子。 长度 = H+h1H + h_1(因为从 Tm1T^{m-1} 的根到最深叶子 HH,再接新子树的最深叶子 h1h_1,但这样会重复计算叶子? 要小心)。

    实际上,从 Tm1T^{m-1} 的根到新子树最深叶子的结点数 = H+h11H + h_1 - 1? 我们来算: 路径:根 -> ... -> 叶子L (H个结点) -> T^1的根 -> ... -> 最深叶子 (h_1个结点),但叶子L和T^1的根是不同结点,所以总结点数 = H + h_1。

    所以这种情况长度 = H+h1H + h_1

    3.6 递推公式

    dmd_m = TmT^m 的直径(结点数), HmH_m = TmT^m 中从根到最深叶子的结点数。

    初始: d1d_1 = T1T^1 的直径, H1H_1 = T1T^1 的高度(结点数)。

    递推:

    情况 A:直径完全在 Tm1T^{m-1} 内部:dm1d_{m-1}

    情况 B:直径跨两个新子树:d1+2h1d_1 + 2 h_1? 不对,上面我们得到 dm1+2h1d_{m-1} + 2 h_1? 检查: 我们取 Tm1T^{m-1} 的直径端点 u,vu,v(叶子),它们下面接 T1T^1,则新路径长 = dm1+2h1d_{m-1} + 2 h_1? 不对,上面算的是 2h1+dm12 h_1 + d_{m-1}? 再检查: AABB 结点数 = h1h_1 (A到u) + dm1d_{m-1} (u到v) + h1h_1 (v到B) = 2h1+dm12 h_1 + d_{m-1}。 但 AAuuh1h_1 个结点? 不对,AAuu 结点数 = h1+1h_1 + 1(见前推导),所以总 = (h1+1)+dm1+(h1+1)1(h_1+1) + d_{m-1} + (h_1+1) - 1(因为u和v重复计算了一次)? 我们画图:

    路径: AA (新子树1最深) -> ... -> rur_u (T^1根) -> uu (T^{m-1}叶) -> ... -> vv (T^{m-1}叶) -> rvr_v (T^1根) -> ... -> BB (新子树2最深)。

    结点数 = h1h_1 (A到u) + dm1d_{m-1} (u到v) + h1h_1 (v到B) - 1? 因为u和v算了两次? 我们按结点序列数:

    A到u: A, ..., r_u, u 共 h1+1h_1+1 个结点。 u到v: u, ..., v 共 dm1d_{m-1} 个结点(因为u,v是直径端点)。 v到B: v, r_v, ..., B 共 h1+1h_1+1 个结点。

    拼接:A...u...v...B,u和v各出现一次,所以总 = $(h_1+1) + (d_{m-1} - 2) + (h_1+1) = 2 h_1 + d_{m-1}$。

    好,所以情况 B 长度 = 2h1+dm12 h_1 + d_{m-1}

    情况 C:直径从 Tm1T^{m-1} 的根到新子树最深叶子:长度 = Hm1+h1H_{m-1} + h_1

    所以:

    $$d_m = \max(d_{m-1},\ 2h_1 + d_{m-1},\ H_{m-1} + h_1) $$

    显然 2h1+dm1dm12 h_1 + d_{m-1} \ge d_{m-1},所以 dm=max(2h1+dm1, Hm1+h1)d_m = \max(2 h_1 + d_{m-1},\ H_{m-1} + h_1)

    3.7 HmH_m 的递推

    TmT^m 的根到最深叶子的路径: = Tm1T^{m-1} 的根到最深叶子(Hm1H_{m-1} 个结点) + 该叶子下接的 T1T^1 的根到最深叶子(h1h_1 个结点) - 1(重复计算该叶子)? 不对,应该是 Hm1+h11H_{m-1} + h_1 - 1? 检查:

    路径:根(T^{m-1}) -> ... -> 叶子L (H_{m-1}个结点) -> 根(T^1) -> ... -> 最深叶子(h_1个结点)。 叶子L和根(T^1)是不同结点,所以总 = Hm1+h1H_{m-1} + h_1

    所以 Hm=Hm1+h1H_m = H_{m-1} + h_1

    初始 H1=h1H_1 = h_1T1T^1 的高度)。

    因此 Hm=mh1H_m = m \cdot h_1

    3.8 最终递推

    d1d_1 已知(输入树的直径), h1h_1 已知(输入树的高度,根深度1)。

    递推:

    dm=max(2h1+dm1,Hm1+h1)d_m = \max(2h_1 + d_{m-1}, H_{m-1} + h_1)

    其中 Hm1=(m1)h1H_{m-1} = (m-1) h_1

    所以:

    dm=max(2h1+dm1, mh1)d_m = \max( 2h_1 + d_{m-1},\ m h_1 )

    初始 d1d_1 已知。

    3.9 解递推

    递推式:

    dm=max(2h1+dm1, mh1)d_m = \max(2h_1 + d_{m-1},\ mh_1)

    d1d_1 已知。

    如果 d1h1d_1 \ge h_1,观察: d2=max(2h1+d1, 2h1)=2h1+d1d_2 = \max(2 h_1 + d_1,\ 2 h_1) = 2 h_1 + d_1(因为 d1h1>0d_1 \ge h_1 > 0)。 $d_3 = \max(2 h_1 + d_2,\ 3 h_1) = \max(2 h_1 + 2 h_1 + d_1,\ 3 h_1) = \max(4 h_1 + d_1,\ 3 h_1)$。 因为 d1h1d_1 \ge h_14h1+d15h1>3h14 h_1 + d_1 \ge 5 h_1 > 3 h_1,所以 d3=4h1+d1d_3 = 4 h_1 + d_1

    模式:dm=2(m1)h1+d1d_m = 2(m-1) h_1 + d_1? 检查 m=2: 21h1+d1=2h1+d12\cdot 1 h_1 + d_1 = 2 h_1 + d_1 对。 m=3: 4h1+d14 h_1 + d_1 对。

    所以通解:

    dm=d1+2(m1)h d_m = d_1 + 2(m - 1)h ,如果 $$d_1 \geq h_1$

    如果 d1<h1d_1 < h_1,则可能后来被 mh1m h_1 超过。 但 d1d_1 是输入树的直径,h1h_1 是输入树的高度,一般 d12h11d_1 \ge 2 h_1 - 1? 不一定,比如链:高度=h,直径=h,所以 d1=h1d_1 = h_1。 那么 d1h1d_1 \ge h_1 总是成立? 因为直径至少等于高度(根到最深叶子)。 所以 d1h1d_1 \ge h_1

    因此最终:

    dm=d1+2(m1)h1d_m = d_1 + 2(m-1)h_1

    4. 算法步骤

    读入 n,mn, m 和父数组。

    建树 T1T^1

    T1T^1 的直径 d1d_1(结点数)。

    T1T^1 的高度 h1h_1(从根到最深叶子的结点数,根深度1)。

    输出 d1+2(m1)h1d_1 + 2(m-1) h_1

    时间复杂度 O(n)O(n)


    5. 最终公式

    dm=d1+2(m1)h1d_m = d_1 + 2(m-1)h_1

    其中 d1d_1T1T^1 的直径(结点数),h1h_1T1T^1 的高度(结点数,根深度为1)。

    • 1

    信息

    ID
    3949
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者