A Good Problem
一道赛艇题
一棵树初始所有点不联通,支持两种操作:
- 连接u,v两个节点
- 查询结点u所能到的最远点
首先不难看出最远点一定在当前的直径两端的点,问题变为如何在合并时维护直径。
考虑维护LCA的F数组,我采用启发式合并,每次暴力更新一棵子树的F数组和depth数组,这样就能维护结点之间的距离,直径直接在4个点中枚举一下比较即可,复杂度为\(O(nlog^2n)\)。
对于这种合并+距离查询,维护F数组是个好主意!
一道赛艇题
一棵树初始所有点不联通,支持两种操作:
首先不难看出最远点一定在当前的直径两端的点,问题变为如何在合并时维护直径。
考虑维护LCA的F数组,我采用启发式合并,每次暴力更新一棵子树的F数组和depth数组,这样就能维护结点之间的距离,直径直接在4个点中枚举一下比较即可,复杂度为\(O(nlog^2n)\)。
对于这种合并+距离查询,维护F数组是个好主意!