求区间和(线段树)

Posted SSL_LKJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求区间和(线段树)相关的知识,希望对你有一定的参考价值。

求区间和

在这里插入图片描述
在这里插入图片描述

输入样例

10 20
0 1 10
1 1 4
0 6 6
1 4 10
1 8 9
1 4 9
0 10 2
1 1 8
0 2 10
1 3 9
0 7 8
0 3 10
0 1 1
1 3 8
1 6 9
0 5 5
1 1 8
0 4 2
1 2 8
0 1 1

输出样例

10
6
0
6
16
6
24
14
50
41

解题思路

本题为线段树模板题

可参考线段树练习题一(线段树)

AC代码

#include<cstdio>
using namespace std;
int n,m;
long long sum[1000005]; 
void build(int k,int l,int r)
{
	if(l==r)
	{
		sum[k]=0;
		return;
	}
	int mid=(l+r)/2;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
	sum[k]=sum[k*2]+sum[k*2+1];
}
void change(int k,int l,int r,int x,int v)
{
	if(l==r)
	{
		sum[k]+=1ll*v;
		return;
	}
	int mid=(l+r)/2;
	if(x<=mid)change(k*2,l,mid,x,v);
	else change(k*2+1,mid+1,r,x,v);
	sum[k]=1ll*sum[k*2]+1ll*sum[k*2+1];
}
long long query(int k,int l,int r,int x,int y)
{
	if(x<=l&&r<=y)return sum[k];
	int mid=(l+r)/2;
	long long ans=0;
	if(x<=mid)ans+=query(k*2,l,mid,x,y);
	if(y>mid)ans+=query(k*2+1,mid+1,r,x,y);
	return ans;
}
int main()
{
	scanf("%d%d",&n,&m);
	build(1,1,n);
	while(m--)
	{
		int k,a,b;
		scanf("%d%d%d",&k,&a,&b);
		if(k==0)change(1,1,n,a,b);
		else printf("%lld\\n",query(1,1,n,a,b));
	}
	return 0;	
} 


谢谢

以上是关于求区间和(线段树)的主要内容,如果未能解决你的问题,请参考以下文章

线段树及其基本操作

ybtoj线段树课堂过关例题1求区间和

线段树模板1 - 求区间和

ACM HDU 1166 敌兵布阵 简单的线段树 求区间和

线段树求(可整段修改区间)区间最值pascal 比如求最大值,加上正数的我会编,但是加负数的就不会了。

线段树2 求区间最小值