HDU 1698 Just a Hook(线段树成段更新)

本文介绍了一种使用线段树实现区间更新的方法,并详细解释了如何通过惰性标记来优化更新操作,提高效率。
#include "string"
#include "iostream"
#include "cstdio"
#include "cmath"
#include "algorithm"
#define INF 0x3f3f3f3f
#define INFL 0x3f3f3f3f3f3f3f3fLL
using namespace std;
typedef long long LL;
const int M=55;
#define lson l , m , rt << 1   
#define rson m + 1 , r , rt << 1 | 1   
const int maxn = 111111;  
int h , w , n;  
int col[maxn<<2];  
int sum[maxn<<2];  
void PushUp(int rt) {  
    sum[rt] = sum[rt<<1] + sum[rt<<1|1];  
}  
//懒人标记   
void PushDown(int rt,int m) {  
    if (col[rt]) {  
        col[rt<<1] = col[rt<<1|1] = col[rt];  
        sum[rt<<1] = (m - (m >> 1)) * col[rt];  
        sum[rt<<1|1] = (m >> 1) * col[rt];  
        col[rt] = 0;  
    }  
}  
void build(int l,int r,int rt) {  
    col[rt] = 0;  
    sum[rt] = 1;  
    if (l == r) return ;  
    int m = (l + r) >> 1;  
    build(lson);  
    build(rson);  
    PushUp(rt);  
}  
void update(int L,int R,int c,int l,int r,int rt) {  
    if (L <= l && r <= R) {  
        col[rt] = c;  
        sum[rt] = c * (r - l + 1);  
        return ;  
    }  
    PushDown(rt , r - l + 1);  
    int m = (l + r) >> 1;  
    if (L <= m) update(L , R , c , lson);  
    if (R > m) update(L , R , c , rson);  
    PushUp(rt);  
}  

int main() {  
    int T , n , m;  
    scanf("%d",&T);  
    for (int cas = 1 ; cas <= T ; cas ++) {  
        scanf("%d%d",&n,&m);  
        build(1 , n , 1);  
        while (m --) {  
            int a , b , c;  
            scanf("%d%d%d",&a,&b,&c);  
            update(a , b , c , 1 , n , 1);  
        }  
        printf("Case %d: The total value of the hook is %d.\n",cas , sum[1]);  
    }  
    return 0;  
}  


线段树成段更新的应用,需要用到惰性标记,,多开一个数组,以及区分于单点更新不同。。还是挺好理解的。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值