hdu 1698 Just a Hook(数据结构:线段树)

本文详细介绍了如何利用线段树数据结构和延迟标记技术来解决栅栏材质更新问题,包括代码实现、工作原理及优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个题就是说给你一个初始材质为铜的栅栏

每次更新一段材质为金或银或铜

金对应的一根栅栏价值为3

银对应的一根栅栏价值为2

铜对应的一根栅栏价值为1

让你输出最后的栅栏总价值

线段树区间更新,看到资料上说这里要用到延迟标记的概念

就是说当前依次更新,只更新了根节点的值,其子节点的值暂时不更新

等到下次可能访问子节点的时候才更新它的信息和父节点保持一致

毫无疑问这可以省去很多时间提高效率

我们用col表示材质,初始化为0,如果检测到当前的某个节点col值不为0, 则更新子节点和父节点信息保持一致

代码如下:

#include <cstdio>
#include <iostream>
#include <algorithm>
#define MAXN 100100
#define LL long long
using namespace std;

struct Node {
    int col, val;
}s[MAXN<<2];

void PushUp(int rt) {
    s[rt].val = s[rt<<1].val + s[rt<<1|1].val;
}

void PushDown(int rt, int m) {
    if(s[rt].col) {
        s[rt<<1].col = s[rt<<1|1].col = s[rt].col;
        s[rt<<1].val = s[rt<<1].col*(m-(m>>1));
        s[rt<<1|1].val = s[rt<<1|1].col*(m>>1);
        s[rt].col = 0;
    }
}

void build(int l, int r, int rt) {
    s[rt].col = 0;
    s[rt].val = 1;
    if(l == r)
        return ;
    int m = (l+r) >> 1;
    build(l, m, rt<<1);
    build(m+1, r, rt<<1|1);
    PushUp(rt);
}

void update(int L, int R, int c, int l, int r, int rt) {
    if(L<=l && r<=R) {
        s[rt].col = c;
        s[rt].val = c*(r-l+1);
        return ;
    }
    PushDown(rt, r-l+1);
    int m = (l+r) >> 1;
    if(L <= m)
        update(L, R, c, l, m, rt<<1);
    if(R > m)
        update(L, R, c, m+1, r, rt<<1|1);
    PushUp(rt);
}

int main(void) {
    int T, n, q, x, y, z;
    scanf("%d", &T);
    for(int t=1; t<=T; ++t) {
        scanf("%d%d", &n, &q);
        build(1, n, 1);
        while(q--) {
            scanf("%d%d%d", &x, &y, &z);
            update(x, y, z, 1, n, 1);
        }
        printf("Case %d: The total value of the hook is %d.\n", t, s[1].val);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值