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

    1.线段树处理什么问题?

    线段树主要处理区间的元素修改和查找问题,比树状数组适用范围广,但常数较大;

    2.线段树是什么?

    线段树,是由线段组成的树?是,但不准确。
    我们看一下他解决的问题,你会发现,用暴力的话,时间复杂度大概是O(n*q);
    很显然,这样的复杂度在提高组中是不被允许的,所以我们急需一种更为高效的算法。
    于是,线段树横空出世!(此处应有掌声......)
    观察暴力思路,我们发现,时间主要是浪费在枚举上。
    我们需要考虑的是区间,而暴力则必须一个一个元素的处理,所以,我们可以建一棵代表一段区间的树,进行区间元素的处理。我们称之,线段树。

    3.线段树怎么实现?

    首先,我们考虑一段数列:
    我们假设其为:1 2 3 4 5 5 6;
    我们要将第一个到第5个加1,怎么做?
    我们可以先将一棵树,根节点为1至n(n为元素个数)
    然后将这个区间二分,分为左右两个区间,左节点为左区间,右节点为右区间。这样一直分下去,直到不可分为止。(图见教材)
    这样,我们就得到了一颗线段树。
    当我们要修改某个区间值时,我们只需修该被它包含的最大节点(即最前节点,因为此节点区间包含它的子树所包含的所有区间,所以不用向下考虑)的值即可。就像1至5,可将其分为1至3,4至5,只需修改两次即可。
    由线段树的构建方法可知,每一个区间都可以这样完全划分。所以此算法正确。
    那么,只这样修改后,如果我们需要调用他的子树怎么办?他的子树没有更新呀!要是我们每修改一次就更新它的子树,就太慢了。所以,我们用一个lazy标记,
    显示他的子树需要被更新,及其数值,然后,我们就可以一边查找,一边更新了。
    关于多重线段树,呵呵,自己看吧,我的手好不想被一篇博客废掉(微笑)

  • 相关阅读:
    【LOJ】#6432. 「PKUSC2018」真实排名
    【Codechef】BB-Billboards
    【BZOJ】4361: isn
    【BZOJ】4380: [POI2015]Myjnie
    【BZOJ】4292: [PA2015]Równanie
    【LOJ】#121. 「离线可过」动态图连通性
    【BZOJ】4025: 二分图
    【LOJ】#2230. 「BJOI2014」大融合
    【SPOJ】QTREE6-Query on a tree VI
    小白初理解树状数组
  • 原文地址:https://www.cnblogs.com/lxyzlzj/p/13371987.html
Copyright © 2011-2022 走看看