• Poj3468 线段树 成段更新


    线段树----成段更新

    题目唯一需要注意的地方是 延迟标志 的那个地方

     1 #include <stdio.h>
     2 
     3 #define lson l, m, rt<<1
     4 #define rson m+1, r, rt<<1|1
     5 
     6 const int maxn = 100004;
     7 
     8 char     cmd[2];
     9 int      n, mNum, a, b, c;
    10 __int64  sum[maxn<<2]={0}, col[maxn<<2]={0};
    11 
    12 void BuildTree(int l, int r, int rt)
    13 {
    14     col[rt] = 0;
    15     if (l == r)
    16     {
    17         scanf("%I64d", &sum[rt]);
    18         return ;
    19     }/* End of If */
    20     
    21     int m = (l+r)>>1;
    22     BuildTree(lson);
    23     BuildTree(rson);
    24     sum[rt] = sum[rt<<1] + sum[rt<<1|1];    /* Push Up */
    25 }/* BuildTree */
    26 
    27 void PushDown(int rt, int k)  /* 延迟标志 */
    28 {
    29     if (col[rt])
    30     {
    31         col[rt<<1] += col[rt]; /* caution,因为col[rt]的更新出错,我WA了好多次 */
    32         col[rt<<1|1] += col[rt];
    33         sum[rt<<1] += col[rt]*(k-(k>>1));
    34         sum[rt<<1|1] += col[rt]*(k>>1);
    35         col[rt] = 0;
    36     }
    37 }/* PushDown */
    38 
    39 __int64 Query(int L, int R, int l, int r, int rt)
    40 {
    41     if (L<=l && r<=R)
    42         return sum[rt];
    43     
    44     PushDown(rt, r-l+1);    /* Push down */
    45     
    46     __int64 ret = 0;
    47     int     m = (l+r)>>1;
    48 
    49     if (L <= m)
    50         ret += Query(L, R, lson);
    51     if (R > m)
    52         ret += Query(L, R, rson);
    53 
    54     return ret;
    55 }/* Query */
    56 
    57 void UpData(int L, int R, int c, int l, int r, int rt)
    58 {
    59     if (L<=l && r<=R)
    60     {
    61         col[rt] += c;
    62         sum[rt] += c*(r-l+1);
    63         
    64         return ;
    65     }/* End of If */
    66 
    67     PushDown(rt, r-l+1);    /* Push down */
    68 
    69     int m = (l+r)>>1;
    70 
    71     if (L <= m)
    72         UpData(L, R, c, lson);
    73     if (R > m)
    74         UpData(L, R, c, rson);
    75     sum[rt] = sum[rt<<1] + sum[rt<<1|1];    /* Push Up */
    76 }/* UpData */
    77 
    78 int main()
    79 {
    80     scanf("%d %d", &n, &mNum);
    81     
    82     BuildTree(1, n, 1);
    83     for (int i=1; i<=mNum; ++i)
    84     {
    85         scanf("%s", cmd);
    86         if (cmd[0] == 'Q')
    87         {   /* Query */
    88             scanf("%d %d", &a, &b);
    89             printf("%I64d\n", Query(a, b, 1, n, 1));
    90         }
    91         else
    92         {   /* Add */
    93             scanf("%d %d %d", &a, &b, &c);
    94             UpData(a, b, c, 1, n, 1);
    95         }
    96     }/* End of For */
    97     
    98     return 0;
    99 }
  • 相关阅读:
    七、Vue Cli+ApiCloud
    六、取消eslint 校验代码
    六、匿名方法
    五、vue中export和export default的使用
    四、Vue CLI-异步请求(axios)
    接口自动化测试(7)
    selenium 封装
    flask 动手写的接口平台
    flask入门篇
    python 自动化接口测试(6)
  • 原文地址:https://www.cnblogs.com/yewei/p/2480688.html
Copyright © 2020-2023  润新知