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 }