热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HDU1698JustaHook题解&代码

题目要求是对于一个初始值均为1的区间进行区间修改,修改目标为:[a,b]区间内的值被修改为c对于多组数据的每组数据输出q次修改后的全区间和基本线段树了…只有两个元素需要维护:sum和ad

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

#include
#include
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(rb)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;
}

推荐阅读
author-avatar
攻玉是我_944
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有