看到很多人用二分,这里提供一个线性做法。
首先求出树的直径,设直径长度为 ddd,然后再在直径的正数和倒数第 ⌊d4⌋+⌊d mod 42⌋+1\lfloor \frac{d}{4} \rfloor + \lfloor \frac{d \bmod 4}{2} \rfloor + 1⌊4d ⌋+⌊2dmod4 ⌋+1 个放上去两个中心,然后枚举一下直径上这两个点之间的节点除直径外引出去的最长链的长度加上它到两个中心的距离的最小值,取最大值,这个最大值与 ⌊d4⌋+⌊d mod 42⌋\lfloor \frac{d}{4} \rfloor + \lfloor \frac{d \bmod 4}{2} \rfloor⌊4d ⌋+⌊2dmod4
⌋ 的平均值向上取整既为所求,因为两个中心可以往直径里缩,证明较为简单。
代码:
彩蛋:把 ⌊d4⌋+⌊d mod 42⌋\lfloor \frac{d}{4} \rfloor + \lfloor \frac{d \bmod 4}{2} \rfloor⌊4d ⌋+⌊2dmod4 ⌋ 写成 ⌊d3⌋+⌊d mod 32⌋\lfloor \frac{d}{3} \rfloor + \lfloor \frac{d \bmod 3}{2} \rfloor⌊3d ⌋+⌊2dmod3 ⌋ 能得到 95 pts95\ pts95 pts 的高分。