概括
线段树是一咱二叉搜索树,与区间树相似,它将一个区间划分成一些子区间,每个子区间对应线段树中的一个叶结点
线段树可以快速查找一个节点在若干条线段中出现的次数,时间复杂度$O(\log N)$,它还有一个空间优化:离散化
线段树资料线段树完全版 ~by NotOnlySuccess
入门
想一想我们学习过的RMQ,RMQ是用来求区间最值问题的, 一次处理,n次查询.如果数据在查询的过程中改变了怎么办?
我们从一个简单的题目来入门线段树:
有一个数组aN+1,a[1]~a[N]里面的数字是变化的(1<= a[i]<=50)
接下来每行有一条命令,命令有4种形式:
- (1) Add i j,i和j为正整数,a[i]+=j(j不超过30)
- (2)Sub i j ,i和j为正整数,a[i]-=j(j不超过30;
- (3)Query i j ,i和j为正整数,i<=j,表示询问a[i]+a[i+1]+….a[j];
(4)End 表示结束,这条命令在每组数据最后出现;
sample input
1
10
1 2 3 4 5 6 7 8 9 10
Query 1 3
Add 3 6
Query 2 7
Sub 10 2
Add 6 3
Query 3 10
End
每组数据最多有40000条命令
单点更新
操作
- build() 建立
- update() 更新操作
- pushup(rt) 用孩子更新父亲
- pushdown(rt) 把当前结点信息给孩子结点
- query(l,r,rt) 查询区间信息
- maxn maxn<<2
- lson rson
build tree
成段更新
离散化
区间合并
poj3667
扫描线
多颗线段树问题
ZKW线段树
经典题目
- 投影
- 海报