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 }

 

 

 

 

 


 

你可能感兴趣的:(HDU)