hdu 1698 Just a Hook (线段树)



看完理论知识来做的额这道题  ,前面一直wa   很多细小的地方都没有考虑周全,还没有理解到线段树的精髓。先记录下:

代码如下 :

#include<stdio.h>
#define nn 100000
struct node 
{
    int l,r,val;
}t[nn*4];
int value;
//建线段树
void make (int s,int e,int id)
{
    t[id].l=s;
    t[id].r=e;
    t[id].val=1;
    if(s==e)return ;
    else 
    {
        int mid=(t[id].l+t[id].r)/2;
        make(s,mid,id*2);
        make(mid+1,e,id*2+1);
    }
}
//更新每个节点的数据
void update (int s,int e,int id)
{
    if(t[id].val==value)
        return ;
    if(t[id].l==s&&t[id].r==e)
    {
        t[id].val=value;
        return;
    }        
    //    这步操作是很重要的?
    if(t[id].val>0)
    {
        t[id*2+1].val=t[id*2].val=t[id].val;
        t[id].val=0;
    }
    int mid=(t[id].l+t[id].r)/2;
    if(s>mid)update(s,e,id*2+1);
    else if(e<=mid)update(s,e,id*2);
    else 
    {
        update(mid+1,e,id*2+1);
        update(s,mid,id*2);
    }
}
//查询 计算最终的值
int  query(int id)
{
    if(t[id].val>0)
            return t[id].val*(t[id].r-t[id].l+1);
    return query(id*2+1)+query(id*2);
}
int main()
{
    int T;
    int num=0;
    int n;
    int Q;
    int a,b;
    scanf("%d",&T);
    while(T--)
    {
        num++;
        scanf("%d",&n);
        make(1,n,1);
        scanf("%d",&Q);
        while(Q--)
        {
            scanf("%d%d%d",&a,&b,&value);
            update(a,b,1);
        }
        printf("Case %d: ",num);        
        printf("The total value of the hook is %d.\n",query(1));
    }
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值