SegmentTree
线段树
一、简介
线段树是一种树形数据结构,用于维护区间信息
线段树的每一个节点表示一段区间,根节点表示整个区间,而叶节点表示区间的一个点
线段树可以高效地完成区间查询、区间修改等操作,时间复杂度为O(logn)
二、操作
(1)建树 build
(2)自下而上更新 pushup
(3)自上而下更新 pushdown
(4)修改 modify
(5)查询 query
(1)建树
给定一段区间,建立起一棵线段树
1 | |
(2)自下而上更新
由子节点推导出父节点的值
1 | |
(4)修改
1.单点修改
1
2
3
4
5
6
7
8
9
10//u-当前节点 k-待修改节点的编号 x-待修改的值
void modify(int u,int k,int x){
if(tr[u].l==k&&tr[u].r==k) tr[u].v=x;//找到了待修改节点,直接修改
else{
int mid=(tr[u].l+tr[u].r)/2;
if(k<=mid) modify(u*2,k,x);//如果待修改节点在区间左半部分,在左半部分查找
else modify(u*2+1,k,x);//在右半部分查找
pushup(u);//自下而上更新每个节点
}
}
2.区间修改
(5)查询
1 | |