标签:
题目链接: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): 52476 Accepted Submission(s):
21985
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 5 using namespace std; 6 7 struct node 8 { 9 int l,r,num; 10 } s[200000]; 11 12 void InitTree(int l,int r,int k) 13 { 14 s[k].l=l; 15 s[k].r=r; 16 s[k].num=0; 17 if (r==l) 18 return ; 19 int mid=(l+r)/2; 20 InitTree(l,mid,2*k); 21 InitTree(mid+1,r,2*k+1); 22 } 23 24 void UpdataTree(int i,int add,int k) 25 { 26 if (s[k].r==i&&s[k].l==s[k].r) 27 { 28 s[k].num+=add; 29 return ; 30 } 31 int mid=(s[k].l+s[k].r)/2; 32 if (mid>=i) 33 { 34 UpdataTree(i,add,k*2); 35 } 36 else if (mid<i) 37 { 38 UpdataTree(i,add,k*2+1); 39 } 40 s[k].num=s[k*2].num+s[k*2+1].num; 41 } 42 43 int sum; 44 45 void SearchTree(int st,int e,int k) 46 { 47 if (st==s[k].l&&e==s[k].r) 48 { 49 sum+=s[k].num; 50 return ; 51 } 52 int mid=(s[k].l+s[k].r)/2; 53 if (e<=mid) 54 SearchTree(st,e,k*2); 55 else if (st>mid) 56 SearchTree(st,e,k*2+1); 57 else 58 { 59 SearchTree(st,mid,k*2); 60 SearchTree(mid+1,e,k*2+1); 61 } 62 } 63 64 int main () 65 { 66 int T,a,x,y,flag=1; 67 char ch[10]; 68 scanf("%d",&T); 69 while (T--) 70 { 71 int n; 72 scanf("%d",&n); 73 InitTree(1,n,1); 74 for (int i=1; i<=n; i++) 75 { 76 scanf("%d",&a); 77 UpdataTree(i,a,1); 78 } 79 printf ("Case %d:\n",flag++); 80 while (~scanf("%s",ch)) 81 { 82 sum=0; 83 if (strcmp(ch,"End")==0) 84 break; 85 else if (strcmp(ch,"Add")==0) 86 { 87 scanf("%d%d",&x,&y); 88 UpdataTree(x,y,1); 89 } 90 else if (strcmp(ch,"Sub")==0) 91 { 92 scanf("%d%d",&x,&y); 93 UpdataTree(x,-y,1); 94 } 95 else 96 { 97 scanf("%d%d",&x,&y); 98 SearchTree(x,y,1); 99 printf ("%d\n",sum); 100 } 101 } 102 } 103 return 0; 104 }
标签:
原文地址:http://www.cnblogs.com/qq-star/p/4437430.html