E - Just a Hook

思路:区间修改即可。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int t,n,m,tot;
struct nond{
    int l,r;
    int sum,falg;
}tree[101000*4];
void up(int now){
    tree[now].sum=tree[now<<1].sum+tree[now<<1|1].sum;
}
void build(int now,int l,int r){
    tree[now].l=l;
    tree[now].r=r;
    if(tree[now].l==tree[now].r){
        tree[now].sum=1;
        return ;
    }
    int mid=(tree[now].l+tree[now].r)>>1;
    build(now<<1,l,mid);
    build(now<<1|1,mid+1,r);
    up(now);
}
void down(int now){
    tree[now<<1].sum=(tree[now<<1].r-tree[now<<1].l+1)*tree[now].falg;
    tree[now<<1|1].sum=(tree[now<<1|1].r-tree[now<<1|1].l+1)*tree[now].falg;
    tree[now<<1].falg=tree[now<<1|1].falg=tree[now].falg;
    tree[now].falg=0;
}
void change(int now,int l,int r,int x){
    if(tree[now].l==l&&tree[now].r==r){
        tree[now].sum=(tree[now].r-tree[now].l+1)*x;
        tree[now].falg=x;
        return;
    }
    if(tree[now].falg)    down(now);
    int mid=(tree[now].l+tree[now].r)>>1;
    if(r<=mid)    change(now<<1,l,r,x);
    else if(l>mid)    change(now<<1|1,l,r,x);
    else{ change(now<<1,l,mid,x);change(now<<1|1,mid+1,r,x); }
    up(now);
}
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);tot++;
        memset(tree,0,sizeof(tree));
        build(1,1,n);scanf("%d",&m);
        for(int i=1;i<=m;i++){
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            change(1,x,y,z);
        }
        printf("Case %d: The total value of the hook is %d.\n",tot,tree[1].sum);
    }
}

 

posted @ 2018-02-24 21:01  一蓑烟雨任生平  阅读(208)  评论(0编辑  收藏  举报