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

线段树 区间修改

时间:2015-04-10 23:47:58      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:

 1 struct node {
 2     int l, r;
 3     int lazy;
 4     LL sum;
 5     LL add;
 6 }tree[MAXN];
 7 int a[100005];
 8 void build(int v, int l, int r) {
 9     tree[v].l = l;
10     tree[v].r = r;
11     tree[v].lazy = 0;
12     tree[v].add = 0;
13     if(l == r) {
14         //tree[v].lazy = 1;
15         //tree[v].sum = a[l-1];
16         return;
17     }
18     int mid = (l + r) / 2;
19     build(2*v, l, mid);
20     build(2*v+1, mid+1, r);
21     tree[v].sum = tree[2*v].sum + tree[2*v+1].sum;
22 }
23 void update(int v, int l, int r, LL a) {
24     if(tree[v].l == l && tree[v].r == r) {
25         tree[v].lazy = 1;
26         tree[v].add += a;
27         return ;
28     }
29     tree[v].sum += (r - l + 1) * a;
30     int mid = (tree[v].l + tree[v].r) / 2;
31     if(r <= mid) {
32         update(2*v, l ,r, a);
33     } else {
34         if(l > mid) {
35             update(2*v+1, l, r, a);
36         } else {
37             update(2*v, l, mid, a);
38             update(2*v+1, mid+1, r, a);
39         }
40     }
41 }
42 LL query(int v, int l, int r) {
43     LL ans = 0;
44     if(tree[v].lazy) {
45         ans += tree[v].add * (r - l + 1);
46     }
47     if(tree[v].l == l && tree[v].r == r) {
48         ans += tree[v].sum;
49         return ans;
50     }
51     int mid = (tree[v].l + tree[v].r) / 2;
52     if(r <= mid) {
53         return ans + query(2*v, l ,r);
54     } else {
55         if(l > mid) {
56             return ans + query(2*v+1, l, r);
57         } else {
58             return ans + query(2*v, l, mid) + query(2*v+1, mid+1, r);
59         }
60     }
61 }

 

线段树 区间修改

标签:

原文地址:http://www.cnblogs.com/mitrenick/p/4415952.html

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