HDU1698-Just a Hook

题目大意:

多组样例,每组样例初始给定\(n\)\(1\),每次操作\(x,y,z\),将区间\([x,y]\)中所用元素全部修改成\(z\),最后询问\(n\)个数的和。

思路:

线段树入门题,区间修改,区间覆盖,\(lazy\)标记与下放,此处仅用作复习,不进行基础讲解,细节见代码。

Code:

#include<bits/stdc++.h>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define mid (l+r)/2
using namespace std;
const int maxn=2e5+10;
//线段树 区间覆盖 lazy标记 区间查询
int t,x,y,z,n,m;
char s[10];
int q[maxn];
struct node{
    int tr[maxn<<2],lazy[maxn<<2];
    void pushup(int rt){
        tr[rt]=tr[rt<<1]+tr[rt<<1|1];
    }
    void pushdown(int l,int r,int rt){//下传标记
        tr[rt<<1]=(mid-l+1)*lazy[rt];
        tr[rt<<1|1]=(r-mid)*lazy[rt];
        lazy[rt<<1]=lazy[rt<<1|1]=lazy[rt];//标记覆盖
        lazy[rt]=0;//标记清空
    }
    void build(int l,int r,int rt){
        if(l==r){
            tr[rt]=1;
            return ;
        }
        build(lson);
        build(rson);
        pushup(rt);
    }
    void update(int L,int R,int l,int r,int rt,int val){
        if(L<=l&&r<=R){
            tr[rt]=(r-l+1)*val;//直接修改
            lazy[rt]=val;//标记覆盖
            return ;
        }
        if(lazy[rt]){
            pushdown(l,r,rt);
        }
        if(L<=mid){
            update(L,R,l,mid,rt<<1,val);
        }
        if(R>mid){
            update(L,R,mid+1,r,rt<<1|1,val);
        }
        pushup(rt);
    }
    int query(int L,int R,int l,int r,int rt){
        if(L<=l&&r<=R){
            return tr[rt];
        }
        int sum=0;
        if(lazy[rt]){
            pushdown(l,r,rt);
        }
        if(L<=mid){
            sum=(sum+query(L,R,lson));
        }
        if(R>mid){
            sum=(sum+query(L,R,rson));
        }
        return sum;
    }
    void init(){
        for(int i=1;i<=maxn*4-1;++i){
            lazy[i]=0;
        }
    }
}sgt;
int main(){
    int ca=0;
    scanf("%d",&t);
    while(t--){
        int Q;
        sgt.init();//多样例清空lazy
        scanf("%d",&n);
        scanf("%d",&Q);
        sgt.build(1,n,1);
        while(Q--){
            scanf("%d %d %d",&x,&y,&z);
            sgt.update(x,y,1,n,1,z);//区间[x-y]的值全部修改成z
        }
        printf("Case %d: The total value of the hook is %d.\n",++ca,sgt.query(1,n,1,n,1));
    }
    return 0;
}
posted @ 2021-03-17 22:22  Qquun  阅读(44)  评论(0)    收藏  举报