zoukankan      html  css  js  c++  java
  • 线段树合并

    前言

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

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

    合并(1):暴力合并

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

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

    合并(2):启发式合并

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

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

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

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

    合并(3)

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

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

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

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

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

    例题

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

  • 相关阅读:
    搭建consul cluster(三节点)
    php设计模式之:装饰者模式
    php设计模式之:中介者模式
    PECL 和 PEAR
    firefox汉化(利用中文插件)
    数据结构之最小树生成(用php描述)
    php设计模式之:观察者模式
    Ubuntu安装Microsoft Windows Fonts微软字体库
    mysql事物处理
    php数字转中文
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/Segment_Merge.html
Copyright © 2011-2022 走看看