0.适用范围
线段树是一种数据结构,用于进行区间快速修改及查询。
1.先导知识
二叉树(略)
2.定义
线段树的每个结点代表着一个区间,我们将这棵树以数组的方式存储。
设一个下标为、代表区间
的结点,二分该结点,则该结点的左孩子(假如有的话)下标为
、代表区间
;右孩子(假如有的话)下标为
、代表区间
从线段树的定义中可以发现,需要开大约4倍空间(或者说是大于等于n的最小的2的正数次幂*2)
3.lazy标志
lazy标志表示该下标对于该lazy值已计入计算,但其子节点还未用这个lazy值进行更新
因此需要使用pushDown函数实现lazy标志的传递
void pushDown(int id)
{
if(segTree[id].lazy)
{
int lid=id<<1,rid=id<<1|1;
segTree[lid].lazy+=segTree[id].lazy;
segTree[rid].lazy+=segTree[id].lazy;
segTree[lid].val+=segTree[id].lazy*(segTree[lid].r-segTree[lid].l+1);
segTree[rid].val+=segTree[id].lazy*(segTree[rid].r-segTree[rid].l+1);
segTree[id].lazy=0;
}
}//向下传递lazy
4.建树
按照定义建树即可
void pushUp(int id)
{
segTree[id].val=segTree[id