zoukankan      html  css  js  c++  java
  • HDOJ 1698 Just a Hook

    带 lazy tag 的线段树,维护区间和,含区间修改操作(最后一次询问)。

    # include <stdio.h>
    
    # define MAXN (100005 * 4)
    
    char lazy[MAXN];
    int sum[MAXN];
    
    void build(int x, int y, int r)
    {
        sum[r] = y-x+1;
        lazy[r] = 0;
        if (x == y) return ;
        int mid = (x+y)>>1, ls = r<<1, rs = r<<1|1;
        build(x, mid, ls);
        build(mid+1, y, rs);
    }
    
    void update(int r)
    {
        sum[r] = sum[r<<1] + sum[r<<1|1];
    }
    
    void pushdown(int x, int y, int r)
    {
        int ls, rs, mid;
        if (lazy[r])
        {
            ls = r << 1, rs = r << 1 | 1, mid = (x+y)>>1;
            lazy[ls] = lazy[rs] = lazy[r], lazy[r] = 0;
            sum[ls] = lazy[ls]*(mid-x+1);
            sum[rs] = lazy[rs]*(y - mid);
        }
    }
    
    void change(int x, int y, int r, int s, int t, int val)
    {
        if (s<=x && y<=t)
        {
            sum[r] = val*(y-x+1);
            lazy[r] = val;
            return ;
        }
        pushdown(x, y, r);
        int mid = (x+y)>>1, ls = r<<1, rs = r<<1|1;
        if (s <= mid) change(x, mid, ls, s, t, val);
        if (mid+1<=t) change(mid+1, y, rs, s, t, val);
        update(r);
    }
    
    void init(void)
    {
        int n, m, x, y, z;
        
        scanf("%d%d", &n, &m);
        build(1, n, 1);
        while (m--)
        {
            scanf("%d%d%d", &x, &y, &z);
            change(1, n, 1, x, y, z);
        }
    }
    
    int main()
    {
        int T, i;
        
        scanf("%d", &T);
        for (i = 1; i <= T; ++i)
        {
            init();
            printf("Case %d: The total value of the hook is %d.\n", i, sum[1]);
        }
        
        return 0;
    }
  • 相关阅读:
    Python 递归
    Python 面向过程编程
    Python 协程函数
    Python-第三方库requests详解
    Python 三元表达式
    linux copy
    centos 安装软件
    mysql 权限
    mysql 权限 备份
    android 开发
  • 原文地址:https://www.cnblogs.com/JMDWQ/p/2647263.html
Copyright © 2011-2022 走看看