HDU1166:敌兵布阵
传送门这道题是线段树的基础题,只涉及线段树的点修改及其查询
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAXN 50010
using namespace std;
int f[MAXN<<2],a[MAXN];
void build(int l,int r,int now)
{
if(l==r)
{
f[now]=a[l];
return;
}
int mid=(l+r)>>1;
build(l,mid,now<<1);
build(mid+1,r,now<<1|1);
f[now]=f[now<<1]+f[now<<1|1];
}
//a[x]+=y;
void Update(int l,int r,int x,int y,int now)
{
if(l==r)
{
f[now]+=y;
return;
}
int mid=(l+r)>>1;
if(x<=mid)
Update(l,mid,x,y,now<<1);
else
Update(mid+1,r,x,y,now<<1|1);
f[now]=f[now<<1]+f[now<<1|1];
}
//区间查询(求和)
int Query(int l,int r,int L,int R,int now)
{
if(L<=l&&R>=r) return f[now];
int mid=(l+r)>>1;
int ans=0;
if(L<=mid) ans+=Query(l,mid,L,R,now<<1);
if(R>mid) ans+=Query(mid+1,r,L,R,now<<1|1);
return ans;
}
int main()
{
ios::sync_with_stdio(false);
int i,T,n,x,y,Case=0;
char ch[20];
cin>>T;
while(T--)
{
memset(a,0,sizeof(a));
memset(f,0,sizeof(f));
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
build(1,n,1);
printf("Case %d:\n",++Case);
while(true)
{
cin>>ch;
if(ch[0]=='E') break;
cin>>x>>y;
if(ch[0]=='Q')
printf("%d\n",Query(1,n,x,y,1));
else if(ch[0]=='A')
Update(1,n,x,y,1);
else if(ch[0]=='S')
Update(1,n,x,-y,1);
}
}
return 0;
}