hdu 1698 Just a Hook 【线段树+lazy】

本文介绍了一个基于线段树的数据结构实现,重点讲解了懒惰标记的应用及其实现细节。通过具体代码示例,解释了如何进行区间更新与查询操作。

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

题目

写了一天的线段树,这道题主要说明一下sum是赋值的,不是累加的,并且在push_down的时候lazy也是赋值的。因可能对懒标记的理解还不是很透彻吧。

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
const int Max = 1e5+10;
typedef long long ll;
struct Tree{
    int L,R;
    ll sum;
    int lazy;
} tree[Max<<2];

void PushUp(int x)
{
    tree[x].sum = tree[x<<1].sum+tree[x<<1|1].sum;
}
void pushdown(int x,int num)
{
    if(tree[x].lazy){
        tree[x<<1].sum=tree[x].lazy*(num-(num/2));
        tree[x<<1|1].sum=tree[x].lazy*(num/2);
        tree[x<<1].lazy = tree[x].lazy;
        tree[x<<1|1].lazy=tree[x].lazy;
        tree[x].lazy=0;
    }
}
void build(int x,int l,int r)
{
    tree[x].L=l;
    tree[x].R=r;
    tree[x].sum=0;
    tree[x].lazy=0;
    if(l==r){
        tree[x].sum=1;return;
    }
    int mid = (l+r)>>1;
    build(x<<1,l,mid);
    build(x<<1|1,mid+1,r);
    PushUp(x);
}
void update(int x,int l,int r,int val)
{
    int L = tree[x].L,R=tree[x].R;
    if(l<=L&&R<=r)
    {
        tree[x].lazy=val;
        tree[x].sum=(ll)(R-L+1)*val;
        return ;
    }
    pushdown(x,R-L+1);
    int mid = (L+R)>>1;
    if(l<=mid)
        update(x<<1,l,r,val);
    if(mid<r)
        update(x<<1|1,l,r,val);
    PushUp(x);
}
ll query(int x,int l,int r)
{
    ll res = 0;
    int L=tree[x].L,R=tree[x].R;
    if(l<=L&&r>=R){
        return tree[x].sum;
    }
    pushdown(x,R-L+1);
    int mid = (L+R)>>1;
    if(l<=mid)
        res += query(x<<1,l,r);
    if(mid<r)
        res += query(x<<1|1,l,r);
    return res;
}
int main()
{
   int T,n,m,left,right,sum;
   scanf("%d",&T);
   int cnt = 0;
   while(T--)
   {
       cnt++;
       scanf("%d%d",&n,&m);
       build(1,1,n);
       while(m--)
       {
           scanf("%d%d%d",&left,&right,&sum);
           update(1,left,right,sum);
       }
       printf("Case %d: The total value of the hook is %lld.\n",cnt,query(1,1,n));
   }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值