线段树介绍
线段树是处理区间问题的一种数据结构,它可以处理的问题有:
- 区间查询
- 单点查询
- 区间更新
- 单点更新
线段树的性质
- 叶子节点记录的是一个实际数据
- 非叶子节点记录的是它的孩子节点的值的和/积/最小值/最大值(只要可合并性质)
线段树的基本思想
一般来说,我们认为线段树是一个满二叉树,但是实际情况中,线段树表示的区间元素数量往往不是2的整数次幂。因此,线段树实际上是一个完全二叉树,

线段树的基本操作
-
区间查询
可以采用递归的方法来进行区间查询,头节点有一个区间[1,n],所有的节点都有一个区间(l,r),l=r说明是叶子节点,返回即可。
如果ql,qr包含l,mid,那么递归左边。
如果ql,qr包含mid+1,r,那么递归右边;
统计和/积/最小值/最大值; -
区间更新
敲黑板 这里的操作涉及到一个叫“懒标记”的东西.
- 懒标记

好图不厌百回拿
假如我要把圈出的区域都归0,我可以一个一个遍历(dfs/bfs),但是如果子树巨大,也会很慢。

这样不是更快? - 基本思路在此
若完全被包含,设置懒标记,否则递归左右子树。
- 单点更新

先递归找到节点,再一层一层更新节点。
实现网上很多,就不写了~~(懒~~