求区间和(线段树)
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;
}
谢谢
以上是关于求区间和(线段树)的主要内容,如果未能解决你的问题,请参考以下文章