线段树区间、单点修改查询模板,以及自己对线段树的理解

#include
#include
#include
#include
#define MAXN 300005
using namespace std;
typedef long long ll;
//线段树其实就是一棵二叉搜索树
//lazy就是说mark懒标记,私以为,线段树的精髓就在这个懒标记上
//正是因为lazy的存在,使得区间修改不用投射到对应的每一个节点上,
//才使得修改实现了log级别
ll n, m, a[MAXN], tree[MAXN4], mark[MAXN4];
void push_down(ll p, ll len)
//pushdown操作就是将懒标记下放,本质上是因为这段区间需要取出一部分来
//要获得取出的那一部分的具体信息,原先应该对应修改的信息被暂存在它的前驱节点的lazy上
//因此要下放过去。
{ if(mark[p])
{
mark[p * 2] += mark[p];
mark[p * 2 + 1] += mark[p];
tree[p * 2] += mark[p](len - len / 2);//len是奇数的话,就是mid+1,与建树一致
tree[p * 2 + 1]+= mark[p] * (len / 2);
mark[p] = 0;
}
}
void build(ll l ,ll r,ll p)
//建线段树便是初始化节点的过程
{
if(l == r)
tree[p] = 0;
else
{
ll mid=(l +

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值