HDU1166 (线段树/修改点,询问区间)

详见代码

View Code
 1 /*
 2 改变一个点,询问区间和
 3 线段树
 4 */
 5 #include<stdio.h>
 6 #define lson l , mid , rt << 1
 7 #define rson mid + 1 , r , rt << 1 | 1
 8 const int maxn = 50005;
 9 int sum[ maxn<<2 ],data[ maxn ];
10 
11 void PushUp( int rt ){
12     sum[ rt ]=sum[ rt<<1 ]+sum[ rt<<1 | 1 ];
13 }
14 void build( int l,int r,int rt ){
15     if( l==r ){
16         sum[ rt ]=data[ l ];
17         return ;
18     }
19     int mid;
20     mid=((l+r)>>1);
21     build( lson );
22     build( rson );
23     PushUp( rt );
24     return ;
25 }
26 
27 void update( int pos,int add,int l,int r,int rt ){
28     if( l==r ){
29         sum[ rt ] += add;
30         return ;
31     }
32     int mid;
33     mid=((l+r)>>1);
34     if( pos<=mid )
35         update( pos,add,lson );
36     else 
37         update( pos,add,rson );
38     PushUp( rt );
39     return ;
40 }
41 
42 int query( int from,int to,int l,int r,int rt ){
43     if( from==l && to==r ){
44         return sum[ rt ];
45     }
46     int mid;
47     mid=((l+r)>>1);
48     if( to<=mid )
49         return query( from,to,lson );
50     else if( from>mid )
51         return query( from,to,rson );
52     else return query( from,mid,lson )+query( mid+1,to,rson );
53 }
54 
55 int main(){
56     int T;
57     scanf("%d",&T);
58     for( int t=1;t<=T;t++ ){
59         int n;
60         scanf("%d",&n);
61         for( int i=1;i<=n;i++ )
62             scanf("%d",&data[ i ]);
63         build( 1,n,1 );
64         char s[ 10 ];
65         printf("Case %d:\n",t);
66         while( 1 ){
67             scanf("%s",s);
68             int a,b;
69             if( s[0]=='E' ) break;
70             if( s[0]=='Q' ){
71                 scanf("%d%d",&a,&b);
72                 printf("%d\n",query( a,b,1,n,1 ) );
73             }
74             else if( s[0]=='S' ){
75                 scanf("%d%d",&a,&b);
76                 update( a,-b,1,n,1 );
77             }
78             else if( s[0]=='A' ){
79                 scanf("%d%d",&a,&b);
80                 update( a,b,1,n,1 );
81             }
82         }
83     }
84     return 0;
85 }

 另一种个人标准写法:

View Code
  1 /*
  2 线段树+询问一段区间,改变一个点
  3 */
  4 #include<stdio.h>
  5 #include<string.h>
  6 #include<stdlib.h>
  7 #include<algorithm>
  8 #include<iostream>
  9 #include<queue>
 10 #include<vector>
 11 #include<map>
 12 #include<math.h>
 13 typedef long long ll;
 14 //typedef __int64 int64;
 15 const int maxn = 50005;
 16 const int maxm = 1005;
 17 const int inf = 0x7FFFFFFF;
 18 const double pi = acos(-1.0);
 19 const double eps = 1e-8;
 20 #define left( x ) (x<<1)
 21 #define right( x ) ((x<<1)+1) 
 22 struct tree{
 23     int l,r,num;
 24 }anode[ maxn<<2 ];
 25 int data[ maxn ];
 26 
 27 void pushup( int n ){
 28     anode[ n ].num = anode[ left( n ) ].num+anode[ right( n ) ].num;
 29     return ;
 30 }//向上update    
 31     
 32 void build( int l,int r,int n ){
 33     int mid;
 34     mid = (l+r)>>1;
 35     if( l==r ){
 36         anode[ n ].l = l;
 37         anode[ n ].r = r;
 38         anode[ n ].num = data[ l ];
 39         return ;
 40     }
 41     anode[ n ].l = l;
 42     anode[ n ].r = r;
 43     build( l,mid,left( n ) );
 44     build( mid+1,r,right( n ) );
 45     pushup( n );
 46 }
 47 
 48 void update( int aim_id,int new_num,int n ){
 49     if( anode[ n ].l==aim_id&&anode[ n ].r==aim_id ){
 50         anode[ n ].num += new_num;
 51         return ;
 52     }
 53     if( anode[ left( n ) ].l<=aim_id &&anode[ left( n ) ].r>=aim_id )
 54         update( aim_id,new_num,left( n ) );
 55     else update( aim_id,new_num,right( n ) );
 56     pushup( n );
 57     return ;
 58 }
 59 
 60 int query( int l,int r,int n ){
 61     if( anode[ n ].l==l&&anode[ n ].r==r ){
 62         return anode[ n ].num;
 63     }
 64     int mid;
 65     mid = (anode[ n ].l+anode[ n ].r)>>1;
 66     if( mid>=r ) return query( l,r,left( n ) );
 67     else if( mid<l) return query( l,r,right( n ) );
 68     else return query( l,mid,left( n ) )+query( mid+1,r,right( n ) ); 
 69 } 
 70 int main(){
 71     int ca;
 72     scanf("%d",&ca);
 73     for( int tt=1;tt<=ca;tt++ ){
 74         int n;
 75         scanf("%d",&n);
 76         for( int i=1;i<=n;i++ )
 77             scanf("%d",&data[ i ]);
 78         build( 1,n,1 );
 79         printf("Case %d:\n",tt);
 80         char od[ 12 ];
 81         while( 1 ){
 82             scanf("%s",od);
 83             if( od[ 0 ]=='E' ) break;
 84             if( od[ 0 ]=='A' ){
 85                 int a,b;
 86                 scanf("%d%d",&a,&b);
 87                 update( a,b,1 );
 88             }
 89             else if( od[ 0 ]=='S' ){
 90                 int a,b;
 91                 scanf("%d%d",&a,&b);
 92                 update( a,-b,1 );
 93             }
 94             else if( od[ 0 ]=='Q' ){
 95                 int a,b;
 96                 scanf("%d%d",&a,&b);
 97                 printf("%d\n",query( a,b,1 ));
 98             }
 99         }
100     }
101     return 0;
102 }
keep moving...
原文地址:https://www.cnblogs.com/xxx0624/p/2880300.html