Segment Tree(线段树)

线段树是一种数据结构,适用于区间快速修改和查询。每个结点代表一个区间,存储方式为数组。线段树通过lazy标志处理延迟更新,需要额外空间。建树、更新和查询操作是线段树的主要功能。举例说明了区间加法修改和区间和查询的应用,如2020CCPC绵阳站J题。
摘要由CSDN通过智能技术生成

0.适用范围

线段树是一种数据结构,用于进行区间快速修改及查询。

 

1.先导知识

二叉树(略)

 

2.定义

线段树的每个结点代表着一个区间,我们将这棵树以数组的方式存储。

设一个下标为ID、代表区间[L,R]的结点,二分该结点,则该结点的左孩子(假如有的话)下标为2ID、代表区间[L,\frac{(L+R)}{2}];右孩子(假如有的话)下标为2ID+1、代表区间[\frac{(L+R)}{2}+1,R]

从线段树的定义中可以发现,需要开大约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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值