zoukankan      html  css  js  c++  java
  • Hdu 1698 【线段树 成段更新】.cpp

    题意:

      动态更新一段区间的值..

      最后输出总区间的和..

     

    思路:

      其实就是线段树的成段更新..

      用到了lazy[] 表示懒惰标志..

      懒惰标记:

        就是每次更新不更新到最后..而是更新到包含了区间的最大的节点..

        然后如果下次更新的时候更新到了上次已经更新到的节点..

        那先把上次更新暂停的节点往下更新..直到这次更新的区间最大的节点没有被标记..

     

       这样就省时间了..

     

    Tips:

        pushdown节点就是用来向下更新的..

        

        要注意的是modify函数..即每次更新的时候 把根节点标记为要更新的数 x

        然后顺便求出最大值sum[rt]..

        同时原节点要还原为非标记状态-1

        

        然后向下pushdown 范围是 R-L+1

    Code:

      

    View Code
     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 const int MAXN = 100010;
     5 int sum[MAXN<<2];
     6 int lazy[MAXN<<2];
     7 
     8 void pushup(int rt)
     9 {
    10     sum[rt] = sum[rt<<1] + sum[rt<<1|1];
    11 }
    12 
    13 void pushdown(int rt, int x)
    14 {
    15     if(lazy[rt] != -1) {
    16         lazy[rt<<1] = lazy[rt<<1|1] = lazy[rt];
    17         sum[rt<<1] = (x-(x>>1))*lazy[rt];///!!!
    18         sum[rt<<1|1] = (x>>1)*lazy[rt];///!!!
    19         lazy[rt] = -1;
    20     }
    21 }
    22 
    23 void creat(int l, int r, int rt)
    24 {
    25     lazy[rt] = -1, sum[rt] = 1;
    26     if(l == r) return;
    27     int mid = (l+r)>>1;
    28     creat(l, mid, rt<<1);
    29     creat(mid+1, r, rt<<1|1);
    30     pushup(rt);
    31 }
    32 
    33 void modify(int l, int r, int x, int L, int R, int rt)
    34 {
    35     if(l <= L && r >= R) {
    36         lazy[rt] = x;
    37         sum[rt] = x*(R-L+1);///!!!
    38         return;
    39     }
    40     pushdown(rt, R-L+1);///!!!
    41     int mid = (L+R)>>1;
    42     if(l <= mid) modify(l, r, x, L, mid, rt<<1);
    43     if(r > mid) modify(l, r, x, mid+1, R, rt<<1|1);
    44     pushup(rt);
    45 }
    46 
    47 int main()
    48 {
    49     int i, j, k = 0;
    50     int n, T, q;
    51     int x, y, w;
    52     while(scanf("%d", &T) != EOF)
    53     while(T--)
    54     {
    55         scanf("%d %d", &n, &q);
    56         creat(1, n, 1);
    57 
    58         while(q--) {
    59             scanf("%d %d %d", &x, &y, &w);
    60             modify(x, y, w, 1, n, 1);
    61         }
    62 
    63         printf("Case %d: The total value of the hook is %d.\n", ++k, sum[1]);
    64     }
    65     return 0;
    66 }

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698

  • 相关阅读:
    徐汉彬:Web系统大规模并发——电商秒杀与抢购
    编程语言十一月份排行
    windows C 与 linux C区别?
    inux 下c/c++ 连接mysql数据库全过程-----已经通过验证
    MySql可视化工具MySQL Workbench使用教程
    C语言连接数据库
    C语言连接MySql数据库
    C语言位运算
    python-函数
    python2.x和python3.x共存
  • 原文地址:https://www.cnblogs.com/Griselda/p/2721011.html
Copyright © 2011-2022 走看看