码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-07-06 16:52:47      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   art   

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

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

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

 

touch me

 

bubuko.com,布布扣
  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             else
108             {
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

 

POJ---线段树---=-=,布布扣,bubuko.com

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

标签:style   blog   http   color   os   art   

原文地址:http://www.cnblogs.com/radical/p/3825261.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!