线段树合并

前言

线段树合并虽说是比较基础的内容,且我一直都知道大概的实现方式,但直到最近我才正式去写过一次,我真的太弱了啊。

下面从暴力合并开始,依次介绍几种线段树合并的方式。

合并\(1\):暴力合并

直接暴力抠出线段树中的元素,然后暴力合并。

总合并时间复杂度应为\(O(n^2logn)\)

合并\(2\):启发式合并

应该算是暴力合并的一种优化。

即,每次合并时选取较小的一棵线段树,抠出其中元素插入另一棵线段树中。

这也是如平衡树等一些数据结构的常用合并方式。

总合并时间复杂度应为\(O(nlog^2n)\)

合并\(3\)

这才是此文主要要介绍的线段树合并。

考虑到线段树的一个基本性质,即对于下标范围相同的两棵线段树,它们的形态是完全一样的。

则,我们分别从根节点开始遍历两棵线段树,对于当前位置分情况讨论:

  1. 如果当前位置两棵树上都为空,直接返回。
  2. 如果当前位置是叶节点,直接合并信息。
  3. 如果当前位置只有一棵树上有节点,另一棵树上为空,则令当前位置为前一棵树上此位置的节点,然后返回(注意,这里不再处理子树,复杂度因此得以保证)。
  4. 如果当前位置两棵树上都有节点,则在此位置动态开点新建一个节点,分别合并左儿子和右儿子,然后再从子节点上传并更新信息。

这一过程应该算是很简单的吧,而其总合并时间复杂度为\(O(nlogn)\),十分优秀。

例题

下面给出一道板子题:【BZOJ5457】城市

转载于:https://www.cnblogs.com/chenxiaoran666/p/Segment_Merge.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值