hdu1698 Just a Hook(线段树区间修改)

     一道线段树区间修改模板题,用lazy标记来减少对子节点的更新操作,由于最后是求总区间的价值和,所以都不用写 query 了,看别人有的用 map 写的一点点代码可以过,以后研究下。

    以下是代码:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define N 400000

using namespace std;

int sum[N],lazy[N];

void pushup(int o)
{
    sum[o]=sum[o*2]+sum[o*2+1];
}

void pushdown(int o,int L,int R)
{
    int ls=o*2,rs=o*2+1,m=L+(R-L)/2;
    if(lazy[o]!=0){
        lazy[ls]=lazy[rs]=lazy[o];
        sum[ls]=lazy[o]*(m-L+1);
        sum[rs]=lazy[o]*(R-m);
        lazy[o]=0;
    }
}

void build(int o,int L,int R)
{
    int ls=o*2,rs=o*2+1,m=L+(R-L)/2;
    lazy[o]=0;
    if(L==R){
        sum[o]=1;
        return ;
    }
    build(ls,L,m);
    build(rs,m+1,R);
    pushup(o);
}

void update(int o,int L,int R,int ul,int ur,int v)
{
    int ls=o*2,rs=o*2+1,m=L+(R-L)/2;
    if(ul<=L && ur>=R){
        lazy[o]=v;
        sum[o]=v*(R-L+1);
        return ;
    }
    pushdown(o,L,R);
    if(ul<=m) update(ls,L,m,ul,ur,v);
    if(ur>m)  update(rs,m+1,R,ul,ur,v);
    pushup(o);
}
int main()
{
    int T;
    scanf("%d",&T);
    int ca=1;
    while(T--){
        memset(lazy,0,sizeof(lazy));
        memset(sum,0,sizeof(sum));
        int n;
        scanf("%d",&n);
        build(1,1,n);
        int q;
        scanf("%d",&q);
        for(int i=1;i<=q;i++){
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            update(1,1,n,x,y,z);
        }
        printf("Case %d: The total value of the hook is %d.\n",ca++,sum[1]);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值