HDU1166
题目类型:线段树
题解:线段树经典题,维护区间和(存个模板);
Code:
#include <cstdio>
//维护区间和
using namespace std;
int a[50005];
int tree[50005*4];
char s[100];
void build(int p,int l,int r)
{
if(l==r)
{
tree[p]=a[l];
return ;
}
int mid = (l+r)>>1;
build(2*p,l,mid);
build(2*p+1,mid+1,r);
tree[p]=tree[2*p]+tree[2*p+1];
}
void add(int p,int l,int r,int x ,int num)
{
if(l==r)
{
tree[p]+=num;
return;
}
int mid=(l+r)>>1;
if(x<=mid)add(2*p,l,mid,x,num);
else add(p*2+1,mid+1,r,x,num);
tree[p]=tree[2*p]+tree[2*p+1];
}
int find(int p,int l,int r,int x,int y)
{
if(x <= l&& r <= y)
{
return tree[p];
}
int mid=(l+r)>>1;
if(y<=mid)return find(p*2,l,mid,x,y);
else if(x>mid)return find(2*p+1,mid+1,r,x,y);
return (find(p*2,l,mid,x,mid))+(find(p*2+1,mid+1,r,mid+1,y));
}
int main()
{
int n,k=1,T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
printf("Case %d:\n",k);
k++;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
build(1,1,n);
while(scanf(" %s",s)!=EOF)
{
if(s[0]=='E')break;
int x,y;
scanf("%d%d",&x,&y);
if(s[0]=='A')
{
add(1,1,n,x,y);
}
else if(s[0]=='S')
{
add(1,1,n,x,-y);
}
else if(s[0]=='Q')
{
printf("%d\n",find(1,1,n,x,y));
}
}
}
return 0;
}
(弱明天要考线代。。。可能会停更一回)