hdu 1698 Just a Hook

hdu 1698 Just a Hook

一个简单的线段树

支持把某个区间内的点都改为z,求所有操作之后的区间和

#include<bits/stdc++.h>
using namespace std;

const int maxn = 112345;

int arr[maxn * 4];
int lazy[maxn * 4];

#define root 1,1,n
#define lson o<<1,l,m
#define rson o<<1|1,m+1,r
#define Now int o,int l,int r
#define Mid int m = (l+r)/2

void push_down(int o,int l,int r){
    if(l == r){
        lazy[o] = 0;
        return;
    }
    Mid;
    int v = lazy[o];
    lazy[o] = 0;
    arr[o<<1] = v * (m - l + 1);
    arr[o<<1|1] = v * (r - m);
    lazy[o<<1] = lazy[o<<1|1] = v;
}

void update(Now,int ul,int ur,int v){
    if(ul <= l && r <= ur){
        arr[o] = ( r - l + 1) * v;
        lazy[o] = v;
        return;
    }
    Mid;
    if(lazy[o]){
        push_down(o,l,r);
    }
    if(ul <= m) update(lson,ul,ur,v);
    if(m+1 <= ur) update(rson,ul,ur,v);
    arr[o] = arr[o<<1] + arr[o<<1|1];
}

int main(){
    int T;
    scanf("%d",&T);
    int n,m;
    int icase = 1;
    while(T-- && ~scanf("%d %d",&n,&m)){
        update(root,1,n,1);
        int l,r,v;
        while(m--){
            scanf("%d %d %d",&l,&r,&v);
            update(root,l,r,v);
        }
        printf("Case %d: The total value of the hook is %d.\n",icase++,arr[1]);
    }
    return 0;
}

我怎么这么熟练啊(╯‵□′)╯︵┻━┻

你可能感兴趣的:(hdu 1698 Just a Hook)