• 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
    ", _sum);
    89             }
    90             else{
    91                 scanf("%d%d%d", &_ul, &_ur, &_v);
    92                 update(1, 1, _n);
    93             }
    94         }
    95     }
    96     return 0;
    97 }
  • 相关阅读:
    C#加密算法汇总
    解决无法连接到visual studio开发服务器的问题
    javascript
    js仿移动端的下拉刷新,上拉加载更多。
    博客园第一篇博文——做一个思考行动派
    $("<div />")代表的意思
    ini_set 设置php配置项 在windows和linux下的不同
    Java入门1
    Java入门2
    jQuery获取元素上一个、下一个、父元素、子元素
  • 原文地址:https://www.cnblogs.com/fenice/p/5426008.html
Copyright © 2020-2023  润新知