Segment Tree
aba aba aba
线段树
啥是线段树嘞?
咱先字面了解一下,线段树就是每个结点是一个线段的树,线段的本质可以理解为序列的区间。最常见的是数列序列。哦对,线段树是一棵二叉树。
线段树有啥好嘞?
线段树一共有三个长处。
- 线段树的树高是
级别。 - 对于原始序列的任意一个子区间,都可以在线段树上找到数量在
级别且互不相交的区间的并。不超过 个节点:因为每一层最多选两个节点。 - 总的节点个数为
模板题一
洛谷
给一个数组,有以下操作
- 给
和 , - 给
和 ,询问
分解代码
树的节点
1 | struct node{ |
更新当前节点区间和
1 | inline void pushup(int rt) { |
建树
1 | inline int newn(){ |
解决操作一
1 | void upd(int rt, int l, int r, int x, int y) { |
解决操作二
1 | ll query(int rt, int l, int r, int L, int R) { |
完整的树
1 |
|
位移线段树
总结点数为
构造
1 | void pushup(int rt) { |
单点更新
1 | void update(int pos, int val, int l, int r, int rt) { |
区间更新
1 | ll query(int rt, int l, int r, int L, int R) { |
延迟标记
1 | struct node { |
区间更新2
1 | void update(int rt, int l, int r, int L, int R, int val) { |
1 | void pushdown(int rt, int ln, int rn) {//ln 左二子区间长度 rn 右儿子区间长度 |
延迟标记完整版
1 | struct node{ |
- Post title:Segment Tree
- Post author:Eva.Q
- Create time:2022-02-17 22:38:58
- Post link:https://qyy/2022/02/17/Algorithm/Segment Tree/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.