hdu--1166 线段树区间求和

线段树区间求和简单入门题目

对于每一次输入的数组序列建树

每一次增加减少操作为更新操作,更新过程每个端点的和都更新

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 #define MAX 50010
 5 int num[MAX];
 6 struct SegTree
 7 {
 8     int left,right,value;
 9     int calmid(){
10         return (left+right)/2;
11     }
12 }tt[MAX*3];
13 
14 int bulid(int s,int t,int step)
15 {
16     tt[step].left=s;
17     tt[step].right=t;
18     if(tt[step].right==tt[step].left)
19         return tt[step].value=num[s];
20     int mid=tt[step].calmid();
21     return tt[step].value=bulid(s,mid,step*2)+bulid(mid+1,t,step*2+1);
22 }
23 
24 void update(int id,int x,int step)
25 {
26     tt[step].value+=x;
27     if(tt[step].left==tt[step].right)
28         return;
29     int mid=tt[step].calmid();
30     if(id<=mid){
31         update(id,x,step*2);
32     }else update(id,x,step*2+1);
33 }
34 
35 int query(int s,int t,int step)
36 {
37     if(s<=tt[step].left&&tt[step].right<=t)
38         return tt[step].value;
39     int mid=tt[step].calmid();
40     if(t<=mid){
41         return query(s,t,step*2);
42     }else if(s>mid){
43         return query(s,t,step*2+1);
44     }else return query(s,t,step*2)+query(s,t,step*2+1);
45 }
46 
47 int main()
48 {
49     int T,N,a,b;
50     char c[10];
51     cin>>T;
52     for(int q=1;q<=T;q++)
53     {
54         memset(tt,0,sizeof(tt));
55         memset(num,0,sizeof(num));
56         cin>>N;
57         for(int i=1;i<=N;i++)
58             cin>>num[i];
59         bulid(1,MAX,1);
60         cout<<"Case "<<q<<":"<<endl;
61         while(cin>>c)
62         {
63             if(c[0]=='E')
64                 break;
65             else cin>>a>>b;
66             if(c[0]=='A')
67                 update(a,b,1);
68             else if(c[0]=='S')
69                 update(a,-b,1);
70             else if(c[0]=='Q')
71                 cout<<query(a,b,1)<<endl;
72         }
73 
74     }
75 }

 

 

 

 

 


 

posted @ 2012-07-12 11:08  HUJJ  阅读(358)  评论(0编辑  收藏  举报