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

Problem

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

Data constraint

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

Solution

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

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

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

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

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

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

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

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

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

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

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

  • 但问题是合并后很有可能根会发生改变,也就是倍增的根与当前真正的根不一样.

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值