POJ 3468 A Simple Problem with Integers 线段树

题目链接:

poj: http://poj.org/problem?id=3468

题意:

成段更新,成段查询。

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #define LSON o<<1
 6 #define RSON (o<<1)+1
 7 #define M l+(r-l)/2
 8 using namespace std;
 9 
10 typedef long long LL;
11 const int maxn = (100000 << 2) + 10;
12 
13 int _n, _q;
14 LL _sumv[maxn],_addv[maxn];
15 //bool tag[maxn];
16 
17 void pushdown(int o, int l, int r){
18     if (r > l){
19         _addv[LSON] += _addv[o];
20         _addv[RSON] += _addv[o];
21         _addv[o] = 0;
22     }
23 }
24 
25 void maintain(int o, int l, int r){
26     _sumv[o] = 0;
27     if (r > l){
28         _sumv[o] = _sumv[LSON] + _sumv[RSON];
29     }
30     _sumv[o] += _addv[o] * (r - l + 1);
31 }
32 
33 void build(int o, int l, int r){
34     if (l == r){
35         scanf("%lld", _addv + o);
36     }
37     else{
38         build(LSON, l, M);
39         build(RSON, M + 1, r);
40     }
41     maintain(o, l, r);
42 }
43 
44 int _ul, _ur, _v;
45 void update(int o, int l, int r){
46     if (_ul <= l&&r <= _ur){
47         _addv[o] += _v;
48     }
49     else{
50         pushdown(o, l, r);
51         if (_ul <= M) update(LSON, l, M); else maintain(LSON, l, M);
52         if (_ur > M) update(RSON, M + 1, r); else maintain(RSON, M + 1, r);
53     }
54     maintain(o, l, r);
55 }
56 
57 int _ql, _qr;
58 LL _sum;
59 void query(int o, int l, int r){
60     if (_ql <= l&&r <= _qr){
61         _sum += _sumv[o];
62     }
63     else{
64         pushdown(o, l, r);
65         maintain(LSON, l, M);
66         maintain(RSON, M + 1, r);
67         if (_ql <= M) query(LSON, l, M);
68         if (_qr > M) query(RSON, M + 1, r);
69     }
70 }
71 
72 
73 void init(){
74     memset(_addv, 0, sizeof(_addv));
75 }
76 
77 int main(){
78     while (scanf("%d%d", &_n, &_q) == 2 && _n){
79         init();
80         build(1, 1, _n);
81         char cmd[2];
82         while (_q--){
83             scanf("%s", cmd);
84             if (cmd[0] == 'Q'){
85                 _sum = 0;
86                 scanf("%d%d", &_ql, &_qr);
87                 query(1, 1, _n);
88                 printf("%lld\n", _sum);
89             }
90             else{
91                 scanf("%d%d%d", &_ul, &_ur, &_v);
92                 update(1, 1, _n);
93             }
94         }
95     }
96     return 0;
97 }

 

posted @ 2016-04-23 23:05  fenicnn  阅读(145)  评论(0编辑  收藏  举报