zoukankan      html  css  js  c++  java
  • 线段树 区域覆盖模版题 pku 3468 A Simple Problem with Integers 线段树——成段操作

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

    题目大意:输入N,和Q,代表n个数字和q个操作,然后输入n个数字,然后再输入q个操作,Q代表求询问a,b编号之间的和(包含),C代表把a,b,之间的数都加上c。

    代码:

    View Code
     1 #include <stdio.h>
     2 #include <string.h>
     3 #define maxn 100000*4+50
     4 struct node
     5 {
     6     __int64 num;
     7     __int64 lazy;//lazy标记
     8 }tr[maxn];
     9 __int64 count;
    10 void pushup(__int64 rt)
    11 {
    12     tr[rt].num = tr[rt<<1].num+tr[rt<<1|1].num;
    13 }
    14 void build(__int64 l,__int64 r,__int64 rt)
    15 {
    16     if(l == r)//l r基本上就相当于编号~
    17     {
    18         scanf("%I64d",&tr[rt].num);
    19         tr[rt].lazy = 0;//一定让他先为零
    20         return;
    21     }
    22     __int64 m = (l+r)>>1;
    23     build(l,m,rt<<1);
    24     build(m+1,r,rt<<1|1);
    25     pushup(rt);
    26     return;
    27 }
    28 void pushdown(__int64 rt,__int64 len)
    29 {
    30     if(tr[rt].lazy)
    31     {
    32         tr[rt<<1].lazy += tr[rt].lazy;//一定要是+=哦,因为加法德查询区域为1,3的话,这个lazy标记到1,3就不走了,只有当它再次被询问的时候才往下走。。
    33         tr[rt<<1|1].lazy += tr[rt].lazy;
    34         tr[rt<<1].num += (len-(len>>1))*tr[rt].lazy;
    35         tr[rt<<1|1].num += (len>>1)*tr[rt].lazy;
    36         tr[rt].lazy = 0;
    37     }
    38     return;
    39 }
    40 void update(__int64 lx,__int64 rx,__int64 l,__int64 r,__int64 val,__int64 rt)
    41 {
    42     if(lx <= l && rx >= r)
    43     {
    44         tr[rt].num += val*(r-l+1);
    45         tr[rt].lazy += val;
    46         return;
    47     }
    48     pushdown(rt,r-l+1);
    49      __int64 m = (l+r)>>1;
    50     if(lx <= m)
    51     update(lx,rx,l,m,val,rt<<1);
    52     if(rx > m)
    53     update(lx,rx,m+1,r,val,rt<<1|1);
    54     pushup(rt);
    55     return;
    56 }
    57 __int64 ask(__int64 lx,__int64 rx,__int64 l,__int64 r,__int64 rt)
    58 {
    59     __int64 sum;
    60     sum  = 0;
    61     if(lx <= l && rx >= r)
    62     return tr[rt].num;
    63 
    64     pushdown(rt,r-l+1);//询问的时候把lazy往下延伸
    65 
    66     __int64 m = (l+r)>>1;
    67     if(lx <= m)//区域不要搞错
    68     sum+=ask(lx,rx,l,m,rt<<1);
    69     if(rx > m)
    70     sum+=ask(lx,rx,m+1,r,rt<<1|1);
    71     return sum;
    72 }
    73 int main()
    74 {
    75     __int64 n,q,i,j,k;
    76     scanf("%I64d %I64d",&n,&q);
    77     char order[5];
    78     build(1,n,1);
    79     while(q--)
    80     {
    81         scanf("%s",order);
    82         if(order[0] == 'Q')
    83         {
    84             __int64 x,y;
    85             scanf("%I64d %I64d",&x,&y);;
    86             printf("%I64d\n",ask(x,y,1,n,1));
    87         }
    88         else
    89         {
    90             __int64 x,y,val;
    91             scanf("%I64d %I64d %I64d",&x,&y,&val);
    92             update(x,y,1,n,val,1);
    93         }
    94     }
    95     return 0;
    96 }
  • 相关阅读:
    焦虑来回走
    去省政府客串
    中国地质大学(北京)招生信息有点坑
    张桂梅校长再获殊荣,实至名归!她的故事值得一看再看……
    行内容转为列内容
    公文写作心得
    钟南山院士亲口说的“如何保持健康长寿
    VMware虚拟机出现“内部错误”如何解决?
    CI框架深入篇(2)一些基础的我之不知道的标准格式
    SQL语句学习记录(三)
  • 原文地址:https://www.cnblogs.com/0803yijia/p/2634511.html
Copyright © 2011-2022 走看看