线段树模板
#include <iostream>
#include "stdio.h"#include "stdlib.h"
#include "string.h"
#define N 50005
using namespace std;
struct node {
int date,left,right;
};
struct node tree[N<<2];
void build(int k,int l,int r)//建立线段树
{
tree[k].left=l;tree[k].right=r;tree[k].date=0;
if(l==r) return;
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
}
void update(int k,int pos,int change)//插入元素或更改元素
{
int l=tree[k].left,r=tree[k].right;
if(l==r){
tree[k].date+=change;
return;
}
int mid=(l+r)>>1;
if(pos<=mid) update(k<<1,pos,change);
else update(k<<1|1,pos,change);
tree[k].date=tree[k<<1].date+tree[k<<1|1].date;
}
int cont(int k,int ll,int rr) //统计 ll-rr范围内data的总和
{
int l=tree[k].left,r=tree[k].right;
if(ll<=l&&rr>=r) return tree[k].date;
int ans=0,mid=(l+r)>>1;
if(ll<=mid) ans+=cont(k<<1,ll,rr);
if(rr>mid) ans+=cont(k<<1|1,ll,rr);
return ans;
}
int main()
{
int n,ll,rr;
scanf("%d",&n);
build(1,1,n);
for(int i=1;i<=n;i++)
{
int temp;
scanf("%d",&temp);
update(1,i,temp);
}
scanf("%d%d",&ll,&rr);
printf("%d",cont(1,ll,rr));
}
树状数组模板
#include <iostream>
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define N 50005
using namespace std;
int c[N]={0},n;
int lowbit(int x)
{
return x&(-x);
}
int sum(int x)//求前x项和
{
int ans=0;
while(x>0){
ans+=c[x];
x-=lowbit(x);
}
return ans;
}
void update(int pos,int change) //更新c[pos]的值 并且继续更改后面影响到的值
{
while(pos<=n){
c[pos]+=change;
pos+=lowbit(pos);
}
}
int main()
{
int ll,rr;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int temp;
scanf("%d",&temp);
update(i,temp);
}
scanf("%d%d",&ll,&rr);
printf("%d",sum(rr)-sum(ll-1)); //求ll--rr的和 只需求sum(rr)减去sum(ll)项即可
return 0;
}