线段树模板

本文详细描述了一种基础的线段树实现,重点在于区间修改和查询功能,适合IT技术相关读者。
摘要由CSDN通过智能技术生成
	
	
struct node {
	int l,r,data;
	int lt;
}t[1000010];

int a[1000010];

void build(int l,int r,int i,int a[])
{
	t[i].lt=0;
	t[i].l=l;
	t[i].r=r;

	if(l==r) {
		t[i].data=a[l];
		return ;
	}//为根节点时。
	
	int mid=(l+r)>>1;
	build(l,mid,i*2,a);
	build(mid+1,r,i*2+1,a);
	
	t[i].data=t[i*2].data+t[i*2+1].data;
	
	
}//建树

void push_down(int i)
{

	if(t[i].lt!=0) {
		t[i*2].lt+=t[i].lt;
		t[i*2+1].lt+=t[i].lt;

		int mid=(t[i].l+t[i].r)>>1;
		t[i*2].data+=t[i].lt*(mid-t[i*2].l+1);
		t[i*2+1].data+=t[i].lt*(t[i*2+1].r-mid);//r-(mid+1)+1;

		t[i].lt=0;
	}
	
}

void update(int i,int l,int r,int k)
{

	if(t[i].r<=r && t[i].l>=l){
		t[i].data+=k*(t[i].r-t[i].l+1);
		t[i].lt+=k;//记得加上懒标记。
		return ;
	}//完全包括
	
	push_down(i);

	if(t[i*2].r>=l) {
		update(i*2,l,r,k);
		
	}
	
	if(t[i*2+1].l<=r) {
		update(i*2+1,l,r,k);
	}
	
	t[i].data=t[i*2].data+t[i*2+1].data;
}

int search (int i,int l,int r)
{
	if(t[i].l>=l && t[i].r<=r){
		return t[i].data;
	}

	push_down(i);
	
	int num=0;
	
	if(t[i*2].r>=l ){
		num+=search(i*2,l,r);
	}
	
	if(t[i*2+1].l<=r) {
		num+=search(i*2+1,l,r);
		
	}
	
	return num;;
	
	
}

这里是一个基础的线段树模板。 包括区间修改,区间查询功能。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值