标签:
1 10 1 2 3 4 5 6 7 8 9 10 Query 1 3 Add 3 6 Query 2 7 Sub 10 2 Add 6 3 Query 3 10 End
Case 1: 6 33 59
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166
解题思路:同i hate it,区间内值的查询与更新用线段树来实现。特别注意容易超时。用C语言写。
代码如下:
#include <stdio.h>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int sum[200002];
void PushUp(int rt)
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void Build(int l,int r,int rt)
{
if(l==r)
{
scanf("%d",&sum[rt]);
return ;
}
int m=(r+l)>>1;
Build(lson);
Build(rson);
PushUp(rt);
}
int Query(int a,int b,int l,int r,int rt)
{
if(l>=a&&r<=b)
return sum[rt];
int ret=0;
int m=(l+r)>>1;
if(a<=m)
ret+=Query(a,b,lson);
if(b>m)
ret+=Query(a,b,rson);
return ret;
}
void Update(int a,int num,int l,int r,int rt)
{
if(l==r)
{
sum[rt]+=num;
return;
}
int m=(l+r)>>1;
if(a<=m)
Update(a,num,lson);
else
Update(a,num,rson);
PushUp(rt);
}
int main()
{
int t,n,a,b,cnt=0;
char s[10];
scanf("%d",&t);
while(t--)
{
printf("Case %d:\n",++cnt);
scanf("%d",&n);
Build(1,n,1);
while(scanf("%s",s)!=EOF&&s[0]!='E')
{
scanf("%d%d",&a,&b);
if(s[0]=='Q')
printf("%d\n",Query(a,b,1,n,1));
else if(s[0]=='A')
Update(a,b,1,n,1);
else
Update(a,-b,1,n,1);
}
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/criminalcode/article/details/44850553