• 线段树成段更新 poj 3468 A Simple Problem with Integers


     poj  3468  A Simple Problem with Integers

    题目链接:http://poj.org/problem?id=3468

    题目大意:给出n个数,A1,A2,.....An,给出q个操作,

    C a b c     表示第a个数到第b个数都加上c

    Q a b        表示询问第a个数到第b个数的和

    线段树成段更新:update:成段增减  query:区间求和

                           pushup:把当前结点的信息更新到父结点

                           pushdown:把当前结点的信息更新给儿子结点

    注意:用到int64

    代码如下:

     1 #include<stdio.h>
     2 #define lson l,m,rt<<1
     3 #define rson m+1,r,rt<<1|1
     4 #define N 100010
     5 __int64 tree[N<<2],add[N<<2];
     6 void pushup(int rt)
     7 {
     8     tree[rt]=tree[rt<<1]+tree[rt<<1|1];
     9 }
    10 void pushdown(int rt,int m)
    11 {
    12     if(add[rt])
    13     {
    14         add[rt<<1]+=add[rt];
    15         add[rt<<1|1]+=add[rt];
    16         tree[rt<<1]+=add[rt]*(m-(m>>1));
    17         tree[rt<<1|1]+=add[rt]*(m>>1);
    18         add[rt]=0;
    19     }
    20 }
    21 void build(int l,int r,int rt)
    22 {
    23     add[rt]=0;
    24     if(l==r)
    25     {
    26         scanf("%I64d",&tree[rt]);
    27         return ;
    28     }
    29     int m=(l+r)>>1;
    30     build(lson);
    31     build(rson);
    32     pushup(rt);
    33 }
    34 void update(int L,int R,int c,int l,int r,int rt)
    35 {
    36     if(L<=l&&R>=r)
    37     {
    38         add[rt]+=c;
    39         tree[rt]+=c*(r-l+1);
    40         return ;
    41     }
    42     pushdown(rt,r-l+1);
    43     int m=(l+r)>>1;
    44     if(L<=m)
    45         update(L,R,c,lson);
    46     if(R>m)
    47         update(L,R,c,rson);
    48     pushup(rt);
    49 }
    50 __int64 query(int L,int R,int l,int r,int rt)
    51 {
    52     if(L<=l&&R>=r)
    53         return tree[rt];
    54     pushdown(rt,r-l+1);
    55     int m=(l+r)>>1;
    56     __int64 ret=0;
    57     if(L<=m)
    58         ret+=query(L,R,lson);
    59     if(R>m)
    60         ret+=query(L,R,rson);
    61     return ret;
    62 }
    63 int main()
    64 {
    65     int n,q,a,b,c;
    66     char s[2];
    67     scanf("%d%d",&n,&q);
    68     build(1,n,1);
    69     while(q--)
    70     {
    71         scanf("%s",s);
    72         if(s[0]=='Q')
    73         {
    74             scanf("%d%d",&a,&b);
    75             printf("%I64d\n",query(a,b,1,n,1));
    76         }
    77         else
    78         {
    79             scanf("%d%d%d",&a,&b,&c);
    80             update(a,b,c,1,n,1);
    81         }
    82     }
    83     return 0;
    84 }
    View Code
  • 相关阅读:
    0125——时钟
    0125——动画2
    0124——动画1
    0124——KVC KVO模式
    0123——单例模式
    0122——简单小动画+微博简单模拟2
    0122——UITabBarController
    0119——UIImageView的一些属性 和 简单动画实现
    12月28号 ios设计简单操作
    12月25号 Category类别
  • 原文地址:https://www.cnblogs.com/frog112111/p/3099079.html
Copyright © 2020-2023  润新知