首页 > 代码库 > POJ---线段树---=-=

POJ---线段树---=-=

应该是今夜的世界杯前的最后一题了吧

又是个区间更新-增减 区间查询-求和 类型的题目

连废话都不想打上去了  有点烦那

 

touch me

 

  1 // 线段树  区间更新--增减 区间查询--求和  2   3 #include <iostream>  4 using namespace std;  5   6 const int size = 100010;  7 typedef long long LL;   8 LL ans;  9 struct data 10 { 11     int l; 12     int r; 13     LL flag; 14     LL sum; 15 }tree[size*3]; 16  17 void create( int root , int l , int r ) 18 { 19     int mid = (l+r)>>1; 20     tree[root].l = l; 21     tree[root].r = r; 22     tree[root].flag = 0; 23     if( l==r ) 24     { 25         scanf( "%lld",&tree[root].sum ); 26         return; 27     }     28     create( root<<1 , l , mid ); 29     create( root<<1|1 , mid+1 , r ); 30     tree[root].sum = tree[root<<1].sum + tree[root<<1|1].sum; 31 } 32  33 void pushDown( int root , int len ) 34 { 35     tree[root<<1].flag += tree[root].flag; 36     tree[root<<1].sum+=(len-len/2)*tree[root].flag; 37     tree[root<<1|1].flag += tree[root].flag; 38     tree[root<<1|1].sum+=(len/2)*tree[root].flag; 39     tree[root].flag = 0; 40 } 41  42 void update( int root , int L , int R , LL num ) 43 { 44     int mid = ( tree[root].l + tree[root].r )>>1; 45     if( tree[root].l>=L && tree[root].r<=R ) 46     { 47         tree[root].sum+=num*(tree[root].r-tree[root].l+1);         48         tree[root].flag += num; 49         return; 50     } 51     if( tree[root].flag!=0 ) 52     { 53         pushDown( root , (tree[root].r-tree[root].l+1) ); 54     } 55     if( L<=mid ) 56     { 57         update( root<<1 , L , R , num ); 58     } 59     if( R>=mid+1 ) 60     { 61         update( root<<1|1 , L , R , num ); 62     } 63     tree[root].sum = tree[root<<1].sum + tree[root<<1|1].sum; 64 } 65  66 void query( int root , int L , int R ) 67 { 68     int mid = ( tree[root].l+tree[root].r )>>1; 69     if( tree[root].l>=L && tree[root].r<=R ) 70     { 71         ans+=tree[root].sum; 72         return;  73     } 74     if( tree[root].flag!=0 ) 75     { 76         pushDown( root , (tree[root].r-tree[root].l+1) ); 77     } 78     if( L<=mid ) 79     { 80         query( root<<1 , L , R ); 81     } 82     if( R>=mid+1 ) 83     { 84         query( root<<1|1 , L , R ); 85     } 86     tree[root].sum = tree[root<<1].sum + tree[root<<1|1].sum; 87 } 88  89 int main() 90 { 91     int L , R; 92     int n , m; 93     LL num; 94     char ch; 95     while( ~scanf("%d %d",&n,&m) ) 96     { 97         create( 1 , 1 , n ); 98         while( m-- ) 99         {100             getchar();101             scanf( "%c",&ch );102             if( ch == C )103             {104                 scanf( "%d %d %lld",&L,&R,&num );105                 update( 1 , L , R , num );106             }107             else108             {109                 ans = 0;110                 scanf( "%d %d",&L,&R );111                 query( 1 , L , R );112                 printf( "%lld\n",ans );113             }114         }        115     }116     return 0;117 } 
View Code