hdu 1698 Just a Hook 基本线段树

本文介绍了如何使用线段树在编程中更新区间奖,并最终统计整段数和,实现高效的区间操作。通过构建线段树、更新节点值和计算总和,展示了线段树在解决区间查询和更新问题上的应用。

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

使用线段树更新每段区间的奖(1,2,3),最后在统计整段区间的数和,基本线段树,果断1A啊

#include<iostream>
#include<stdio.h>
using namespace std;
#define N 100000
struct node{
    int l,r,p;
}a[N*4];
int n;
void build(int left,int right,int i){
    a[i].l=left;
    a[i].r=right;
    a[i].p=1;
    if(a[i].l==a[i].r){
        return ;
    }
    int mid=(a[i].l+a[i].r)>>1;
    build(left,mid,i*2);
    build(mid+1,right,i*2+1);
//    a[i].p=a[i*2].p+a[i*2+1].p;
}
void updata(int left,int right,int i,int p){
    if(left==a[i].l&&a[i].r==right){
        a[i].p=p;
        return ;
    }
    if(a[i].p>=1){
        a[i*2].p=a[i].p;
        a[i*2+1].p=a[i].p;
        a[i].p=-1;
    }
    int mid=(a[i].l+a[i].r)>>1;
    if(mid>=right)
        updata(left,right,i*2,p);
    else if(mid<left)
        updata(left,right,i*2+1,p);
    else{
        updata(left,mid,i*2,p);
        updata(mid+1,right,i*2+1,p);
    }
 //   a[i].p=a[i*2].p+a[i*2+1].p;
}
int ans=0;
void sum(int i){
 //   cout<<a[i].l<<" "<<a[i].r<<" "<<a[i].p<<endl;
    if(a[i].p!=-1){
        ans+=a[i].p*(a[i].r-a[i].l+1);
        return ;
    }
    sum(i*2);
    sum(i*2+1);

}
int main(){
    int t,s,x,y,z;
    scanf("%d",&t);
    int cou=1;
    while(t--){
        scanf("%d %d",&n,&s);
        build(1,n,1);
        while(s--){
            scanf("%d%d%d",&x,&y,&z);
            updata(x,y,1,z);
        }
        ans=0;
        sum(1);
        printf("Case %d: The total value of the hook is %d.\n",cou++,ans);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码随想录

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值