线段树为什么开4倍空间?

突然想到,满二叉树不是才2n-1个节点么,为什么开4倍空间??

因为线段树和二叉树是有一点区别的,线段树结点存的是区间,二叉树存的是点,所以线段树会出现许多结点空着的情况 见下图

所以,对于n个点,比n大的最小二次幂即为线段树最底层的结点数,所以所有结点数为 \[ 2^{\lfloor\log_2n\rfloor+1}*2-1 \]
即为4n

原文地址:https://www.cnblogs.com/Zeronera/p/11707603.html

时间: 2024-08-12 05:44:46

线段树为什么开4倍空间?的相关文章

线段树为什么要开4倍空间

线段树为什么要开4倍空间 Creation Time: 19 March 2014Last Modified: 2014-03-23 01:01:26 scinart 最近在看<具体数学>,这篇当做是一个练习吧. 假设我们用一个数组来头轻脚重地存储一个线段树,根节点是1,孩子节点分别是2n, 2n+1, 那么,设线段长为L(即[1..L+1)) 设树的高度为H,对H,有: H(L)={1,L = 11+H(⌈L2⌉),L > 1 这是一个很简单的递归式,并用公式3.11逐次代换,就等到

线段树应开内存

n*2的建树方法,适用于动态建树,就是说没有任何一个节点被浪费的建法.而这里我使用的,或者说大多数人使用的这种用x*2表示左子树 x*2+1表示右子树的建法,是不能只开到n*2的,因为有写节点没用到. 举个列子来说,假如线段树的n = 11,你认为应该建树为22或者23,保守点. 如果你要找[9,9]的区间,就会出现RTE了. 那么开多少才正确呢? 其实,应该是 2^ ( ceiling( log2(n) )+1 ), 即2的log2(n)的上取整加1次幂.

hdu 4027 Can you answer these queries? 线段树区间开根号,区间求和

Can you answer these queries? Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5195 Description A lot of battleships of evil are arranged in a line before the battle. Our commander decides to use our secret weapo

hdu 6183 Color it (线段树 动态开点)

Do you like painting? Little D doesn't like painting, especially messy color paintings. Now Little B is painting. To prevent him from drawing messy painting, Little D asks you to write a program to maintain following operations. The specific format o

BZOJ_4636_蒟蒻的数列_线段树+动态开点

Description 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个数列,初始值均为0,他进行N次操作,每次将数列[a,b)这个区间中所有比k小的数改为k,他想知 道N次操作后数列中所有元素的和.他还要玩其他游戏,所以这个问题留给你解决. Input 第一行一个整数N,然后有N行,每行三个正整数a.b.k. N<=40000 , a.b.k<=10^9 Output 一个数,数列中所有元素的和 Sample Input 4 2 5 1 9 10 4 6

「模板」线段树静态开点(单点+区间修改)、动态开点

相关讲解资料: 树状数组:https://blog.csdn.net/qq_34374664/article/details/52787481 (线段树预备) 线段树讲解: 初学版:https://blog.csdn.net/zearot/article/details/52280189 进阶完整版:https://www.cnblogs.com/AC-King/p/7789013.html 代码: 完整注释模板一张,参(chao)考(xi)楼上的博客 #include<iostream> #

HDU6183 Color it (线段树动态开点)

题意: 一个1e6*1e6的棋盘,有两个操作:给(x,y)加上颜色c,或查找(1,y1)到(x,y2)内的颜色种类数量,最多有50种颜色 思路: 建立50颗线段树,对每个颜色的线段树,维护每个y坐标上x的最小值 但是这样会爆内存,于是动态开点即可 动态开点之后T了一发,就改了下查询的函数,只要有满足在矩形的该颜色,就全线return,果然快了好多 代码: #include<iostream> #include<cstdio> #include<algorithm> #i

李超线段树 - JSOI2008BlueMary开公司

李超线段树用来在平面内动态插入线段,求\(x=t\)直线与这些线段交点的最值 核心是维护每个区间的"最优势线段",即终点位置处最高的线段,询问室对所有包含\(t\)的区间的最优势线段计算答案,最后取\(max\) 模板题:JSOI2008BlueMary开公司 插入直线,求单点最大值 (看代码) #include<bits/stdc++.h> using namespace std; const int N=50004; #define lc (p<<1) #d

[BZOJ3211]花神游历各国(线段树+区间开根)

题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3211 分析: 区间开根是没法区间合并的. 但是注意到10^9开根开个5次就变成1了…… 于是只要在每个区间额外维护个值b,b=1表示这段全部都是1了,不用修改了,b=2表示这段没有全部是1,还要修改 然后这样就行了