20220109-线段树
线段树
1. 基本概念
定义:线段树是一棵满二叉树(除了最后一层),因此可以用堆(一维数组)进行存储;
对于上图中的段,从上到下,从左到右依次编号1,2,3,……
对于某一段
u
:- 父节点为$\left\lfloor x/2 \right\rfloor $,即
u>>1
; - 左儿子为($2x$),即
u<<1
; - 右儿子为($2x+1$),即
u<<1 | 1
;
同时在考虑存储空间时,倒数第二层最多有n个节点,倒数第一层最多有2n个节点,倒数第二层之前最多有(n-1)个节点,因此最多总共有(4n-1)个节点。因此我们需要开$4n$大小的空间。
- 父节点为$\left\lfloor x/2 \right\rfloor $,即
- 5种基本操作:
push_up
:由子节点计算父节点,sum = L.sum + R.sum;push_down
:将父节点修改信息下传至子节点,也被称作懒标记(或延迟标记);build
:将一段区间初始化为线段树;modify
:修改端点或修改区间。query
:查询某一段区间的信息。
- 扫描线法