• HDU 1698


    题目链接:

      http://acm.hdu.edu.cn/showproblem.php?pid=1698

    题目描述:

      有一条长度为N的链,该链每一个单位长度的价值都是1。现有Q个操作,每个操作包括三个数字X, Y, Z, 表示将链中X ~ Y这一段每个单位长度的价值全部改变为Z,注意不是添加Z而是改变为Z。最后问该链的总价值是多少。

    解题思路:

      区间的线段树更新问题,区间更新线段树跟点更新线段树的最主要区别同时也是最难过的坎就是延迟标记lazy数组,不过看完这个ppt:http://yun.baidu.com/s/1jGXToME就可以理解延迟标记是什么意思了。理解了之后就可以自己写出来拉。

      线段树的原理其实说白了也就那样,真正的熟悉方法很简单,把模版打上十遍,自然就熟悉线段树了。

    附代码:

     1 #include <iostream>
     2 #include <cmath>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <map>
     6 #include <vector>
     7 #include <algorithm>
     8 using namespace std;
     9 
    10 #define ll long long
    11 #define INF 0x3f3f3f3f
    12 #define LL_INF 0x3f3f3f3f3f3f3f3f
    13 #define lson l, m, rt << 1
    14 #define rson m + 1, r, rt << 1|1
    15 #define lrt rt << 1
    16 #define rrt rt << 1|1
    17 #define MAX 1001000
    18 
    19 struct SegTree
    20 {
    21     int left, right;
    22     int sum, lazy;
    23     inline int len() { return right - left + 1; }
    24 }SegNode[MAX << 2];
    25 
    26 void pushUp(int rt)
    27 {
    28     SegNode[rt].sum = SegNode[rt << 1].sum + SegNode[rt << 1|1].sum;
    29 }
    30 
    31 void pushDown(int rt)
    32 {
    33     if(!SegNode[rt].lazy) return;
    34     SegNode[lrt].sum = SegNode[lrt].len() * SegNode[rt].lazy;
    35     SegNode[rrt].sum = SegNode[rrt].len() * SegNode[rt].lazy;
    36     SegNode[lrt].lazy = SegNode[rt].lazy;
    37     SegNode[rrt].lazy = SegNode[rt].lazy;
    38     SegNode[rt].lazy = 0;
    39 }
    40 
    41 void build(int l, int r, int rt)
    42 {
    43     SegNode[rt].sum = 1;
    44     SegNode[rt].lazy = 0;
    45     if(l == r) {
    46         SegNode[rt].left = l;
    47         SegNode[rt].right = r;
    48         //printf("%d %d %d
    ", rt, l, r);
    49         return;
    50     }
    51     int m = (l + r) >> 1;
    52     build(lson);
    53     build(rson);
    54     pushUp(rt);
    55     SegNode[rt].left = l;
    56     SegNode[rt].right = r;
    57     //printf("%d %d %d
    ", rt, l, r);
    58 }
    59 
    60 void update(int change, int l, int r, int rt)
    61 {
    62     if(SegNode[rt].left == l && SegNode[rt].right == r) {
    63         SegNode[rt].sum = SegNode[rt].len() * change;
    64         SegNode[rt].lazy = change;
    65         return;
    66     }
    67     pushDown(rt);
    68     int m = (SegNode[rt].left + SegNode[rt].right) >> 1;
    69     if(r <= m)
    70         update(change, l, r, lrt);
    71     else if(l > m)
    72         update(change, l, r, rrt);
    73     else {
    74         update(change, lson);
    75         update(change, rson);
    76     }
    77     pushUp(rt);
    78 }
    79 
    80 int main()
    81 {
    82     //freopen("debug\in.txt", "r", stdin);
    83     //freopen("CON", "w", stdout);
    84     int i, j, k;
    85     int test, kase = 1;
    86     scanf("%d", &test);
    87     while(test--) {
    88         int n, q;
    89         scanf("%d%d", &n, &q);
    90         build(1, n, 1);
    91         int x, y, z;
    92         while(q--) {
    93             scanf("%d%d%d", &x, &y, &z);
    94             update(z, x, y, 1);
    95         }
    96         printf("Case %d: The total value of the hook is %d.
    ", kase++, SegNode[1].sum);
    97     }
    98     return 0;
    99 }
  • 相关阅读:
    创建SSIS包—ETL中典型的数据清洗
    SSIS中的容器和数据流—数据转换(Transformations)
    创建SSIS包—循环和动态package
    SSIS中的容器和数据流—数据转换(Transformations)续
    创建SSIS包—建立端到端的package
    SQL点滴9—SQL Server中的事务处理以及SSIS中的内建事务
    SSIS中的容器和数据流—调试工具数据视图
    SQL点滴11—重置win7登录密码影响SQL登录
    SQL点滴10—使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比
    SSIS中的容器和数据流—举例说明数据转换任务
  • 原文地址:https://www.cnblogs.com/lc520love/p/5311164.html
Copyright © 2020-2023  润新知