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

  • 相关阅读:
    HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)
    CSU 1120 病毒(DP)
    CSU 1116 Kingdoms(枚举最小生成树)
    一种map容器遍历的方法
    CSU 1113 Updating a Dictionary(map容器应用)
    Python模块-virtualenv-虚拟环境
    计算学习原理
    sklearn-特征工程之特征选择
    链家网深圳租房信息分析报告
    test
  • 原文地址:https://www.cnblogs.com/Griselda/p/2721011.html
Copyright © 2011-2022 走看看