• 【POJ】3468 A Simple Problem with Integers


    线段树。段区间,终于完全自己A掉的。

     1 #include <cstdio>
     2 #include <cstring>
     3 
     4 #define MAXN 100005
     5 #define lson l, mid, rt<<1
     6 #define rson mid+1, r, rt<<1|1
     7 
     8 __int64 sums[MAXN<<2];
     9 __int64 adds[MAXN<<2];
    10 
    11 inline void PushUP(int rt) {
    12     sums[rt] = sums[rt<<1] + sums[rt<<1|1];
    13 }
    14 
    15 inline void PushDown(int len, int rt) {
    16     if ( adds[rt] ) {
    17         adds[rt<<1] += adds[rt];
    18         adds[rt<<1|1] += adds[rt];
    19         sums[rt<<1|1] += adds[rt] * (len>>1);
    20         sums[rt<<1] += adds[rt] * (len-(len>>1));
    21         adds[rt] = 0;
    22     }
    23 }
    24 
    25 void build(int l, int r, int rt) {
    26     int mid;
    27     adds[rt] = 0;
    28     if (l == r) {
    29         scanf("%I64d", &sums[rt]);
    30         return ;
    31     }
    32     mid = (l+r)>>1;
    33     build(lson);
    34     build(rson);
    35     PushUP(rt);
    36 }
    37 
    38 void update(int ll, int rr, int c, int l, int r, int rt) {
    39     int mid;
    40     if (ll<=l && rr>=r) {
    41         sums[rt] += c*(r-l+1);
    42         adds[rt] += c;
    43         return ;
    44     }
    45     PushDown(r-l+1, rt);
    46     mid = (l+r)>>1;
    47     if (ll <= mid)
    48         update(ll, rr, c, lson);
    49     if (rr > mid)
    50         update(ll, rr, c, rson);
    51     PushUP(rt);
    52 }
    53 
    54 __int64 query(int ll, int rr, int l, int r, int rt) {
    55     int mid;
    56     __int64 ret = 0;
    57     if (ll<=l && rr>=r)
    58         return sums[rt];
    59     PushDown(r-l+1, rt);
    60     mid = (l+r)>>1;
    61     if (ll <= mid)
    62         ret += query(ll, rr, lson);
    63     if (rr > mid)
    64         ret += query(ll, rr, rson);
    65     //PushUP(rt);
    66     return ret;
    67 }
    68 
    69 int main() {
    70     int n, m;
    71     int x, y, c;
    72     char cmd[3];
    73 
    74     while (scanf("%d %d", &n, &m) != EOF) {
    75         build(1, n, 1);
    76 
    77         while (m--) {
    78             scanf("%s %d %d", cmd, &x, &y);
    79             if (cmd[0] == 'C') {
    80                 scanf("%d", &c);
    81                 update(x,y,c,1,n,1);
    82             } else {
    83                 printf("%I64d
    ", query(x,y,1,n,1));
    84             }
    85         }
    86     }
    87 
    88     return 0;
    89 }
  • 相关阅读:
    RequireJS进阶(二)
    JavaScript判断元素为数字的奇异写法
    RequireJS进阶(三)
    RequireJS进阶(一)
    读Ext之十四(Ext元素)
    JavaScript中__proto__与prototype的关系
    工作流术语
    一个例子(Hello World)
    无题
    再谈调用子流程(1)
  • 原文地址:https://www.cnblogs.com/bombe1013/p/3765516.html
Copyright © 2020-2023  润新知