题解:P8981 「DROI」Round 1 距离

集训习题。特别地,让我们膜拜一下教练 zmwang

对极远点对的理解是关键:设树的直径长度为 \(d\),任意互为最远点的无序点对恰好是所有直径端点对。两次 BFS 求得一条直径 \((s,t)\) 并记录整条路径即可得到 \(d\)

\(d=2L\) 为偶数,则直径唯一中心是顶点 \(c\)。所有直径端点都在深度 \(L\) 的叶子,且必位于 \(c\) 的不同一级子树中;同一子树内部两叶间距离最多为 \(d-2\) 不可能再是直径。令 \(S_x\) 表示结点 \(x\) 的子树里端点数,\(T=S_c\);对非中心结点 \(x\),端点对必须一端在 \(x\) 的子树,另一端在不同一级子树内,记 \(top_x\)\(x\) 所属的一级子树根,则结点贡献为 \(v_x=S_x\bigl(T-S_{top_x}\bigr)\)。对中心结点自身,需要在不同一级子树之间任选两端点组合,按前缀累加可在线性时间算出 \(v_c\)

\(d=2L+1\) 为奇数,则中心是一条边 \((c_0,c_1)\)。所有直径端点必分列此边两侧,且深度分别为 \(L\)\(L+1\)。对每个结点统计其子树内 A 侧端点数 \(A_x\) 与 B 侧端点数 \(B_x\)。两中心自身贡献为 \(A_{c_0}\cdot B_{c_0}\)。若 \(x\) 在 A 侧且非中心,直径要穿过 \(x\) 必须另一端在整条 B 侧,于是 \(v_x=A_x\cdot B_{c_0}\);B 侧对称。

用一次深搜自底向上传递计数。输出要求是 \(\sum_x v_x^k\pmod{998244353}\);遍历所有结点累加,\(k=1\) 直接相加,\(k=2\) 先平方再相加即可。

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

link

posted @ 2025-07-17 11:10  薛儒浩  阅读(46)  评论(0)    收藏  举报