HDU 1698 Just a Hook 题解&代码

题目要求是对于一个初始值均为1的区间进行区间修改,修改目标为:[a,b]区间内的值被修改为c
对于多组数据的每组数据输出q次修改后的全区间和
基本线段树了…只有两个元素需要维护:sum和add,sum表示该点的区间元素和,add表示该点代表的区间当前被赋值的大小
坑点在于多组数据= =要不是某人前(jie)车(wo)之(dai)鉴(ma)我二十分钟肯定调不过,尽管如此也WA了四次= =总之,时刻记住这是多组数据就很简单了

#include<iostream>
#include<stdio.h>
using namespace std;
int T,t,n,q,a,b,c;
int ans,x,add[800020],sum[800020];
void pushdown(int o,int l,int r)
{
    if(!add[o])return;
    sum[o]=add[o]*(r-l+1);
    int mid=(l+r)/2;
    if(l!=r)
    {
        add[o<<1]=add[o];
        add[(o<<1)+1]=add[o];
        sum[o<<1]=add[o]*(mid-l+1);
        sum[(o<<1)+1]=add[o]*(r-mid+1);
    }
    add[o]=0;
}
void maintain(int o,int l,int r)
{
    if(l!=r)
        sum[o]=sum[o<<1]+sum[(o<<1)+1];
    else if(add[o])sum[o]=add[o],add[o]=0;
}
int build(int o,int l,int r)
{
    add[o]=0;
    if(l==r)return sum[o]=1;
    int mid=(l+r)/2;
    return sum[o]=build(o<<1,l,mid)+build((o<<1)+1,mid+1,r);
}
void change(int o,int l,int r)
{
    pushdown(o,l,r);
    if(l>=a && r<=b)
    {
        add[o]=c;
        pushdown(o,l,r);
        return;
    }
    if(r<a || l>b)return;
    int mid=(l+r)/2;
    change(o<<1,l,mid);
    change((o<<1)+1,mid+1,r);
    maintain(o,l,r);
    return;
}
int main(void)
{
    scanf("%d",&T);
    while(++t)
    {
        if(t>T)break;
        scanf("%d",&n);
        build(1,1,n);
        scanf("%d",&q);
        for(int i=1;i<=q;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            change(1,1,n);
        }
        printf("Case %d: The total value of the hook is %d.\n",t,sum[1]);
    }
    return 0;
}

你可能感兴趣的:(线段树,C语言,HDU)