P11766 题解

· · 题解

找出树的直径的中点,可以证明从任意一个点出发的任意一条最长路径都经过这个中点,否则可以在树上找出一条比直径更长的路径。

把路径分成到中点之前和到中点之后两部分计算,需要记录一个节点子树的最大深度,最大深度的节点数量和子树大小。

容易做到 O(n)。细节参见代码。

哦不代码怎么出锅了。感谢 @FRZ_29 和 @dangbowen1008 的 hack 数据。等我找时间去改一下。