zoukankan      html  css  js  c++  java
  • Just a Hook (HDU 1698) 懒惰标记

    Just a Hook (HDU 1698)

    题链

    每一次都将一个区间整体进行修改,需要用到懒惰标记,懒惰标记的核心在于在查询前才更新,比如将当前点rt标记为col[rt],那么此点的左孩子和右孩子标记必然和其一致(直接替换,如果是累积则另当别论),同时这个区间也能很快求出了
    线段树功能:区间更新+区间查询

    #include <cstdio>
    #include <utility>
    #include <queue>
    #include <cstring>
    #define scan(x) scanf("%d",&x)
    #define scan2(x,y) scanf("%d%d",&x,&y)
    #define lson rt<<1,l,mid
    #define rson rt<<1|1,mid+1,r
    #define root 1,1,n
    using namespace std;
    const int Max=1e5+10;
    int sum[Max<<2],col[Max<<2];
    void Pushup(int rt)
    {
        sum[rt]=sum[rt<<1]+sum[rt<<1|1];
    }
    void Build(int rt,int l,int r)
    {
        if(l==r)
        {
            sum[rt]=1;
            col[rt]=0;
            return;
        }
        int mid=(l+r)>>1;
        Build(lson);
        Build(rson);
        Pushup(rt);
    }
    void Pushdown(int rt,int rage)
    {
        if(col[rt])
        {
            col[rt<<1]=col[rt<<1|1]=col[rt];
            sum[rt<<1]=col[rt]*(rage-(rage>>1));
            sum[rt<<1|1]=col[rt]*(rage>>1);
            col[rt]=0;
        }
    }
    void Update(int L,int R,int x,int rt,int l,int r)
    {
        if(L<=l&&r<=R)
        {
            sum[rt]=x*(r-l+1);
            col[rt]=x;
            return;
        }
        Pushdown(rt,(r-l)+1);
        int mid=(l+r)>>1;
        if(L<=mid) Update(L,R,x,lson);
        if(mid<R)  Update(L,R,x,rson);
        Pushup(rt);
    }
    int main()
    {
        int T,ca=1;
        for(scan(T);T;T--)
        {
            memset(sum,0,sizeof(sum));
            memset(col,0,sizeof(col));
            int l,r,k,n,m;
            scan2(n,m);
            Build(root);
            while(m--)
            {
                scanf("%d%d%d",&l,&r,&k);
                Update(l,r,k,root);
            }
            printf("Case %d: The total value of the hook is %d.
    ",ca++,sum[1]);
        }
        return 0;
    }
    
    

    重新写了一次,学习了一份新的模板

    #include<queue>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    #define ll long long
    #define inf 1000000000
    #define mod 1000000007
    using namespace std;
    int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int n,m;
    int a[100005];
    int ls[400005],rs[400005];
    int M[400005],tag[400005];
    void build(int k,int l,int r)
    {
        int mid=(l+r)>>1;
        ls[k]=l;rs[k]=r;tag[k]=0;M[k]=0;
        if(l==r){M[k]=1;return;}
        build(k<<1,l,mid);
        build(k<<1|1,mid+1,r);
        M[k]=M[k<<1]+M[k<<1|1];
    }
    void pushdown(int k)
    {
        if(!tag[k]||ls[k]==rs[k])return;
        tag[k<<1]=tag[k];
        tag[k<<1|1]=tag[k];
        int rage=(rs[k]-ls[k]+1);
        M[k<<1]=(rage-(rage>>1))*tag[k];
        M[k<<1|1]=(rage>>1)*tag[k];
        tag[k]=0;
    }
    void add(int k,int x,int y,int v)
    {
        pushdown(k);
        int l=ls[k],r=rs[k],mid=(l+r)>>1;
        if(x==l&&y==r)
        {
            tag[k]=v;
            M[k]=v*(r-l+1);
            return;
        }
        if(x<=mid) add(k<<1,x,min(y,mid),v);
        if(y>mid) add(k<<1|1,max(x,mid+1),y,v);
        M[k]=M[k<<1]+M[k<<1|1];
    }
    int query(int k,int x,int y)
    {
        pushdown(k);
        int l=ls[k],r=rs[k],mid=(l+r)>>1,ans=0;
        if(x==l&&y==r) return M[k];
        if(x<=mid)ans+=query(k<<1,x,min(y,mid));
        if(y>mid)ans+=query(k<<1|1,max(x,mid+1),y);
        return ans;
    }
    int main()
    {
        int T,ca=1;
        for(T=read();T;T--)
        {
            int l,r,v,n,m;
            n=read();m=read();
            build(1,1,n);
            while(m--)
            {
                scanf("%d%d%d",&l,&r,&v);
                add(1,l,r,v);
            }
            printf("Case %d: The total value of the hook is %d.
    ",ca++,query(1,1,n));
        }
        return 0;
    }
    
    
  • 相关阅读:
    HTML解决浏览器字体大小12px限制,实现自动适应大小
    Oracle 大最插入数据 一段时间之后变慢问题解决方法
    中间件使用-nginx 中ssl证书的设置
    asp.net core学习:准备asp.net core源码编译环境
    批量修改文件名后缀
    tcpdump 抓所有网卡的包
    mysql数据库备份
    x64架构下Linux系统函数调用
    博客背景美化——动态雪花飘落
    MySQL锁:03.InnoDB行锁
  • 原文地址:https://www.cnblogs.com/zsyacm666666/p/6695426.html
Copyright © 2011-2022 走看看