线段树数据结构详解
线段树数据结构详解 Coded by Jelly_Goat. All rights reserved. 这一部分是线段树。 线段树,顾名思义,是一种树形数据结构,适用于各种求区间统一算法的动静两平衡的数据结构。 这里什么是统一算法? (自己口胡的统一算法) 比如求最大值or最小值、区间求和,一样的区间都是一样的算法,这也是和动态dp不同的地方。 前置知识1:二叉搜索树 二叉搜索树就是根节点比左儿子大,比右儿子小的一种二叉树。 前置知识2:向量存储 向量存储是用来存完全二叉树儿子和父亲关系的。 如果不满足,我们还可以用链式前向星存 举个例子: 有一颗完全二叉树,节点数是16,然后你会发现: lson标号=root标号*2 , rson标号=root标号*2+1 。 显然可见不是偶然,是二叉树满了导致的。 那么我们可以用下标表示存储的线段树节点。 例如: tree[100] 就是 tree[200] 和 tree[201] 的root。 今天只讨论最普通的线段树(板子:求和) 操作1:建树 怎样种一棵线段树? Jelly_Goat:需要一条线段 没问题,真的需要原序列。 从上往下二分区间长度,递归建树。 代码示范: //维护根节点的和 inline void update(int rt) { tree[rt].sum=tree[rt*2].sum+tree[rt*2+1].sum; }