作用
解决单点修改、区间询问(区间修改、单点询问,区间修改、区间询问)的问题
复杂度
$O(nlogn)$
概念
线段是是一颗二叉树,线段树上的每一个节点对应序列的一段区间,根节点对应的是[0,n-1]。若一个节点对应的是[l,r]时,当l=r的时候,他是一个叶节点,没有左右儿子,否则它一定有2个儿子,令mid = (l+r)/2;那么,左儿子对应的区间为[l,mid],右儿子对应的区间是[mid+1,r].
·线段树最后一层有n个节点,那么整个线段树的节点数为2n-1(自证不难)。
·线段树的高度为$log_2N$层,当我们需要维护的序列长度是2的整数次幂的时候,线段树是一颗满二叉树。其他情况下,n-1层是满二叉树,最后一层可能不满。
代码
见板子
区间查询操作
三种情况
- 当前区间与带询问区间完全无交集,返回一个对答案无影响的值,如极大的数或者极其小的数
- 询问区间完全包含当前区间,直接返回所维护区间的最小值
- 除了上面两者情况,对两个子节点递归处理,返回最小/最大值 代码见板子
延迟标记
1.区间修改,单点查询 只要记录一下修改对结果的影响就可以,代码见板子