OSDN Git Service

Update segment.md
author雷蒻 <34390285+hsfzLZH1@users.noreply.github.com>
Fri, 2 Aug 2019 13:54:51 +0000 (21:54 +0800)
committerGitHub <noreply@github.com>
Fri, 2 Aug 2019 13:54:51 +0000 (21:54 +0800)
docs/ds/segment.md

index 2081166..b118de0 100644 (file)
@@ -50,8 +50,6 @@ void build(int s, int t, int p) {
 
 分析:容易知道线段树的深度是 $\left\lceil\log{n}\right\rceil$ 的,则在堆式储存情况下叶子节点(包括无用的叶子节点)数量为 $2^{\left\lceil\log{n}\right\rceil}$ 个,又由于其为一棵完全二叉树,则其总节点个数 $2^{\left\lceil\log{n}\right\rceil+1}-1$ 。当然如果你懒得计算的话可以直接把数组长度设为 $4n$ ,因为 $\frac{2^{\left\lceil\log{n}\right\rceil+1}-1}{n}$ 的最大值在 $n=2^{x}+1(x\in N_{+})$ 时取到,此时节点数为 $2^{\left\lceil\log{n}\right\rceil+1}-1=2^{x+2}-1=4n-5$ 。
 
-而如果采用 **动态开点** 的方法(不是一次性开出全部节点的内存,在第一次访问到一个空节点时才开出其内存,这样可以减少空间占用。动态开点的方法见[内存池](../../intro/common-tricks/#mempool)),由于不存在堆式储存中空置节点的问题,不一定会使用所有节点,但是使用时数组的大小仍需设为 $4n$ 。缺点是由于不使用堆式储存,无法知道其左右儿子的编号,故须新增两个域来储存其左右儿子的编号。
-
 ### 线段树的区间查询
 
 区间查询,比如求区间 $[l,r]$ 的总和(即 $a[l]+a[l+1]+ \cdots +a[r]$ )、求区间最大值/最小值等操作。