标签:
http://acm.hdu.edu.cn/showproblem.php?pid=1166
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 79309 Accepted Submission(s):
33553
【题目分析】
单点修改区间查询,明显可以用线段树,但线段树冗长繁杂,所以我们考虑树状数组,很裸
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int c[50010],n,t; char str[]="Add",str1[]="Sub",str2[]="End",sub1[6]; int lowbit(int x) { return x&(-x); } void add(int i,int val) { while(i<=n) { c[i]+=val; i+=lowbit(i); } } int sum(int i) { int s=0; while(i>0) { s+=c[i]; i-=lowbit(i); } return s; } int main() { int k=0,a,b,v,num; scanf("%d",&t); while(t--) { scanf("%d",&n); printf("Case %d:\n",++k); memset(c,0,sizeof c); for(int i=1;i<=n;i++) scanf("%d",&v), add(i,v); while(1) { scanf("%s",sub1); if(!strcmp(str2,sub1)) break; if(!strcmp(sub1,str)) { scanf("%d%d",&a,&b); add(a,b); } else if(!strcmp(sub1,str1)) { scanf("%d%d",&a,&b); add(a,-b); } else { scanf("%d%d",&a,&b); printf("%d\n",sum(b)-sum(a-1)); } } } return 0; }
标签:
原文地址:http://www.cnblogs.com/xiaoningmeng/p/5967647.html