题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166
树状数组:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int a[50001];
int b[50001];
int fun(int x)
{
return x&(x^(x-1));
}
int query(int x,int y)
{
int sum1=0;int sum2=0;
x--;
while(x>0)
{
sum1+=b[x];
x-=fun(x);
}
while(y>0)
{
sum2+=b[y];y-=fun(y);
}
return sum2-sum1;
}
void add(int x,int y,int m)
{
while(x<=m)
{
b[x]+=y;
x+=fun(x);
}
}
void sub(int x,int y,int m)
{
while(x<=m)
{
b[x]-=y;
x+=fun(x);
}
}
int main()
{
/* freopen("3.txt","r",stdin);*/
int N;cin>>N;
for(int i=1;i<=N;i++)
{
int m;cin>>m;
for(int j=1;j<=m;j++)
{
scanf("%d",&a[j]);b[j]=0;
for(int k=j-fun(j)+1;k<=j;k++)
b[j]+=a[k];
}
char ch[10];printf("Case %d:\n",i);
while(scanf("%s",ch)&&ch[0]!='E')
{
int x,y;cin>>x>>y;
switch(ch[0])
{
case 'Q':printf("%d\n",query(x,y));break;
case 'A':add(x,y,m);break;
case 'S':sub(x,y,m);break;
}
}
}
return 0;
}
线段树:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
struct Tree
{int left;int right;int num;};
Tree t[50001*3];
int a[50001];int n,x,y,ans,s;
void build(int l,int r,int now)
{
t[now].left=l;t[now].right=r;
if(l==r){t[now].num=a[l];return;}
int mid=(l+r)>>1; //二分
build(l,mid,now<<1);
build(mid+1,r,(now<<1)+1);
t[now].num=t[now<<1].num+t[(now<<1)+1].num;
}
void modify(int l,int r,int now)
{
if(t[now].left==t[now].right){t[now].num+=y;return;}
int mid=(t[now].left+t[now].right)>>1;
if(x<=mid)modify(l,r,now<<1);
else if(x>mid)modify(l,r,(now<<1)+1);
t[now].num=t[now<<1].num+t[(now<<1)+1].num;
}
void query(int sta,int end,int now)
{
if(sta==t[now].left&&end==t[now].right){ans+=t[now].num;return;}
int mid=(t[now].left+t[now].right)>>1;
if(end<=mid)query(sta,end,now<<1);
else if(sta>mid)query(sta,end,(now<<1)+1);
else
{
query(sta,mid,now<<1);
query(mid+1,end,(now<<1)+1);
}
}
int main()
{
/*freopen("3.txt","r",stdin);*/
int t;scanf("%d",&t);
for(int i=1;i<=t;i++)
{
cin>>n;
for(int j=1;j<=n;j++)
scanf("%d",&a[j]);
build(1,n,1);
printf("Case %d:\n",i);
char ch[10];
while(scanf("%s",ch)&&ch[0]!='E')
{
cin>>x>>y;
switch(ch[0])
{
case 'A':modify(1,n,1);break;
case 'S':y=-y;modify(1,n,1);break;
case 'Q':ans=0;query(x,y,1);printf("%d\n",ans);break;
}
}
}
}