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

线段树(lazy标记)

时间:2015-08-06 00:05:50      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:

  1 # include<cstdio>
  2 # include<iostream>
  3 
  4 using namespace std;
  5 
  6 # define MAX 100004
  7 # define lid id<<1
  8 # define rid id<<1|1
  9 
 10 typedef long long LL;
 11 int n;
 12 
 13 struct Segtree
 14 {
 15     int l,r;
 16     LL lazy,sum;
 17     inline int len()
 18     {
 19         return r-l+1;
 20     }
 21 }tree[MAX*4];
 22 
 23 int a[MAX];
 24 
 25 void push_up( int id )
 26 {
 27     tree[id].sum = tree[rid].sum+tree[lid].sum;
 28 }
 29 
 30 void push_down( int id )
 31 {
 32     if ( tree[id].lazy==0 )
 33         return;
 34     tree[lid].lazy += tree[id].lazy;
 35     tree[rid].lazy += tree[id].lazy;
 36     tree[lid].sum += tree[id].lazy*tree[lid].len();
 37     tree[rid].sum += tree[id].lazy*tree[rid].len();
 38     tree[id].lazy = 0;
 39 }
 40 
 41 void build( int id,int l,int r )
 42 {
 43     tree[id].l = l; tree[id].r = r;
 44     if ( l==r )
 45     {
 46         tree[id].sum = a[l];
 47         return;
 48     }
 49     int mid = (tree[id].l+tree[id].r)/2;
 50     build(lid,l,mid);
 51     build(rid,mid+1,r);
 52     push_up(id);
 53 }
 54 
 55 void update( int id,int l,int r,int val )
 56 {
 57     if ( tree[id].l==l&&tree[id].r==r )
 58     {
 59         tree[id].lazy += val;
 60         tree[id].sum += 1LL*val*tree[id].len();
 61         return;
 62     }
 63     push_down(id);
 64     int mid = ( tree[id].l+tree[id].r )/2;
 65     if ( r <= mid )
 66         update(lid,l,r,val);
 67     else if ( l > mid )
 68         update(rid,l,r,val);
 69     else
 70     {
 71         update(lid,l,mid,val);
 72         update(rid,mid+1,r,val);
 73     }
 74     push_up(id);
 75 }
 76 
 77 LL query( int id,int l,int r )
 78 {
 79     if ( tree[id].l==l&&tree[id].r==r )
 80     {
 81         return tree[id].sum;
 82     }
 83     push_down(id);
 84     int mid = ( tree[id].l+tree[id].r )/2;
 85     if ( r <= mid )
 86         return query(lid,l,r);
 87     else if ( l > mid )
 88         return query(rid,l,r);
 89     else
 90         return query(lid,l,mid)+query(rid,mid+1,r);
 91 }
 92 
 93 int main(void)
 94 {
 95     while ( scanf("%d",&n)!=EOF )
 96     {
 97         for ( int i = 1;i <= n;i++ )
 98         {
 99             scanf("%d",&a[i]);
100         }
101         build(1,1,n);
102         int q; scanf("%d",&q);
103         while( q-- )
104         {
105             int ll,rr,t3; scanf("%d%d%d",&ll,&rr,&t3);
106             update(1,ll,rr,t3);
107             LL ans = query(1,ll,rr);
108             printf("%lld\n",ans);
109         }
110     }
111 
112     return 0;
113 }

 

线段树(lazy标记)

标签:

原文地址:http://www.cnblogs.com/wikioibai/p/4705955.html

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