详见代码
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 }