• 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 }
  • 相关阅读:
    【dp】P1982 小朋友的数字
    NOIp2017囤题计划
    Java语言编写计算器(简单的计算器)
    关于建立Android工程R文件丢失的问题
    读《黑客与画家》
    格式化输出%、基本运算符
    常量、变量;基本数据类型;input()、if、while、break、continue
    初遇Linux
    MVC5+EF6 入门完整教程10 数据查询更新
    Razor语法和Razor引擎大全
  • 原文地址:https://www.cnblogs.com/fenice/p/5426008.html
Copyright © 2020-2023  润新知