A Good Problem

一道赛艇题

一棵树初始所有点不联通,支持两种操作:

  • 连接u,v两个节点
  • 查询结点u所能到的最远点

首先不难看出最远点一定在当前的直径两端的点,问题变为如何在合并时维护直径。

考虑维护LCA的F数组,我采用启发式合并,每次暴力更新一棵子树的F数组和depth数组,这样就能维护结点之间的距离,直径直接在4个点中枚举一下比较即可,复杂度为\(O(nlog^2n)\)

对于这种合并+距离查询,维护F数组是个好主意!

posted @ 2017-03-12 21:01  Krew  阅读(120)  评论(0)    收藏  举报