线段树

本文详细介绍了段式树的懒惰传播实现方法,包括定义变量、建立段式树、更新区间、查询区间等功能。通过具体的代码示例,深入解析了如何在段式树中进行高效的数据操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、定义变量:

#define LL long long
const int Max = 1e5+5;
int n,q;
LL sum[Max>>2]={0};
LL lazy[Max>>2]={0};
LL a[Max];

 

push_up函数:

void push_up(int k)
{
	sum[k]=sum[k<<1]+sum[k<<1|1];
}

push_down函数:

void push_down(int k,int L,int R)
{
	int len = (R-L+1);
	lazy[k<<1]+=lazy[k];
	sum[k<<1]+=lazy[k]*(len-(len>>1));
	lazy[k<<1|1]+=lazy[k];
	sum[k<<1|1]+=lazy[k]*(len>>1);
	lazy[k]=0;
}

建树:

void build(int L,int R,int k)
{
	if(L==R)
	{
		sum[k] = a[L];
		return ;
	}
	int mid = (L+R)>>1;
	build(L,mid,k<<1);
	build(mid+1,R,k<<1|1);
	push_up(k);
	
}

区间更新(这里以区间和为例)

void update(int L,int R,int ql,int qr,int score,int k)
{
	if(ql<=L && qr>=R)
	{
		lazy[k]+=score;
		sum[k]+=(R-L+1)*score;
		return ;
	}
	if(lazy[k]) push_down(k,L,R);
	int mid = (L+R)>>1;
	if(ql<=mid) update(L,mid,ql,qr,score,k<<1);
	if(qr>mid) update(mid+1,R,ql,qr,score,k<<1|1);
	push_up(k);
	
}

区间查询

LL query(int L,int R,int ql,int qr,int k)
{
	LL ret=0;
	if(ql<=L && qr>=R)
	{
		return sum[k];
	}
	int mid = (L+R)>>1;
	int ls =k<<1;
	int rs = k<<1|1;
	if(lazy[k]) push_down(k,L,R);
	if(ql<=mid ) ret+=query(L,mid,ql,qr,ls);
	if(qr>mid) ret+=query(mid+1,R,ql,qr,rs);
	return ret;
	
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值