标签:
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