HDU1698 Just a Hook--線段樹LAZY操作

#include <iostream>  
#include <cstdio>  
#include <cmath>  
#include <algorithm>  
using namespace std;  
#define ll long long  
#define FOR( i , a , b ) for ( int i = a ; i <= b ; ++ i )  
#define Mid ((l+r)>>1)  
#define lson rt<<1,l,Mid  
#define rson rt<<1|1,Mid+1,r  
const int maxn = 100010;  
int sum[maxn<<2],add[maxn<<2];  
      
void build(int rt,int l,int r){  
    add[rt] = 0;  
    if(l == r)
        sum[rt] = 1;  
    else{  
        build(lson);  
        build(rson);  
        sum[rt]=sum[rt<<1]+sum[rt<<1|1];  
    }  
}  
      
void pushDown(int rt,int len){  
    add[rt<<1] = add[rt<<1|1] = add[rt];  
    sum[rt<<1] = (len-(len>>1))*add[rt];  
    sum[rt<<1|1] = (len>>1)*add[rt];  
    add[rt] = 0;  
}  
      
void update(int rt,int l,int r,int L,int R,int z){  
    if(L <= l && r <= R){  
        add[rt] = z;  
        sum[rt] = (r-l+1)*z;  
    }else{  
        if(add[rt])  
            pushDown(rt,r-l+1);  
        if(L <= Mid)  
            update(lson,L,R,z);  
        if(R > Mid)  
            update(rson,L,R,z);  
        sum[rt] = sum[rt<<1] + sum[rt<<1|1];  
    }  
}  
      
int main(){      
    int t,n,q,x,y,z;  
    int cnt=1;  
    scanf("%d",&t);  
    while(t--){  
        scanf("%d%d",&n,&q);  
        build(1,1,n);  
        while(q--){  
            scanf("%d%d%d",&x,&y,&z);  
            update(1,1,n,x,y,z);  
        }  
        printf("Case %d: The total value of the hook is %d.\n", cnt++,sum[1]);  
    }  
    return 0;  
}  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章