• HDU1698 Just a Hook(成段替换+懒惰标记)


    题目大意

    给定一个长度为n的序列A,每个元素值初始全部为1,接下来有m个操作,每次给定操作区间[X,Y]和一个值v,表示把AX,AX+1,…AY的值全部修改为v,完成m次在操作之后要求你求出序列的总和

    题解

    区间修改的模板题。。。需要用到懒惰标记(搞了好久才弄懂o(╯□╰)o)。。。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define MAXN 100005
    #define lson l, m , s << 1
    #define rson m + 1 , r , s << 1 | 1
    using namespace std;
    int sumv[MAXN<<2],setv[MAXN<<2];
    void PushUp(int s)
    {
        sumv[s]=sumv[s<<1]+sumv[s<<1|1];
    }
    void PushDown(int s,int m)
    {
        if(setv[s])
        {
            setv[s<<1]=setv[s<<1|1]=setv[s];
            sumv[s<<1]=(m-(m>>1))*setv[s];
            sumv[s<<1|1]=(m>>1)*setv[s];
            setv[s]=0;
        }
    }
    void build(int l,int r,int s)
    {
        sumv[s]=1;
        setv[s]=0;
        if(l==r) return;
        int m=(l+r)>>1;
        build(lson);
        build(rson);
        PushUp(s);
    }
    void update(int ql,int qr,int d,int l,int r,int s)
    {
        if(ql<=l&&r<=qr)
        {
            setv[s]=d;
            sumv[s]=d*(r-l+1);
            return;
        }
        PushDown(s,r-l+1);
        int m=(l+r)>>1;
        if(ql<=m) update(ql,qr,d,lson);
        if(qr>m) update(ql,qr,d,rson);
        PushUp(s);
    }
    int main(void)
    {
        int n,m,T,x,y,p=0,z;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&n,&m);
            build(1,n,1);
            while(m--)
            {
                scanf("%d%d%d",&x,&y,&z);
                update(x,y,z,1,n,1);
            }
            printf("Case %d: The total value of the hook is %d.\n",++p,sumv[1]);
        }
        return 0;
    }
  • 相关阅读:
    基于雪花算法的单机版
    Spring cloud gateway自定义filter以及负载均衡
    logback转义符与MDC
    录音地址文件保存
    maven加载本地jar
    ES Log4J配置信息
    java线程池
    openstreetmap的数据下载
    php更新版本后(路径更改后)要做的调整
    重启IIS
  • 原文地址:https://www.cnblogs.com/zjbztianya/p/3076630.html
Copyright © 2020-2023  润新知