5874. 【NOIP2018提高组模拟9.18】小p的决心(倍增LCA 离线 或 在线)

版权声明:蒟蒻写的文章,能看就行了,同时欢迎大佬们指点错误 https://blog.csdn.net/Algor_pro_king_John/article/details/82859856

Problem

  • 维护一个至多 n n 节点的森林, Q Q 个操作,支持连边和查询两点 L C A LCA .

Data constraint

  • 1 N 100000 1 Q 100000 1\le N\le 100000,1\le Q\le 100000

Solution

1. 离线做法
  • 首先考虑比较简单的离线做法.

  • 我们可以考虑先把最终的森林给构出来.

  • 再每棵树上任意找一点 R t Rt 作为原始根,然后求个倍增数组.

  • 然后扫一遍询问,并查集维护到每一个询问操作时,两个点 u , v u,v 所在的树的真正根 r o o t root .

  • 那么答案其实就是拥有 l , r , r o o t l,r,root 两两 L C A LCA 的最大深度的那个点.

  • 具体证明可以分类讨论,这是一种很经典的套路.

  • 其实这种套路在5783. 【省选模拟2018.8.8】树 这道题里也出现了,当时我乱搞搞出来了,但这一次却没有想到.

2.在线做法
  • 为了使自己印象更深刻一些,下次遇到这种求LCA的题目能更灵活变通,我还打了一下在线做法.

  • 不难发现离线做法的时间复杂度实际上就是找 L C A LCA 的时间复杂度,这个可以在 O ( n l o g n ) O(nlogn) 时间内做到.

  • 但如果强制在线,我们需要怎样做呢?

  • 很容易想到的是启发式合并倍增数组.

    扫描二维码关注公众号,回复: 4440420 查看本文章
  • 但问题是合并后很有可能根会发生改变,也就是倍增的根与当前真正的根不一样.

  • 显然,这就是上面离线所说的,需要做的3次LCA.

  • 时间复杂度近似 O ( n l o g 2 n ) O(nlog^2n) ,实际上远远比这小.

猜你喜欢

转载自blog.csdn.net/Algor_pro_king_John/article/details/82859856