HDU 1698 Just a Hook 线段树 成段替换

http://blog.csdn.net/u013368721/article/details/31374285

segment tree 区间更新覆盖

//Hello. I'm Peter.
//#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstdio>
#include<iostream>
#include<sstream>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<cctype>
#include<ctime>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
using namespace std;
typedef long long ll;
#define peter cout<<"i am peter"<<endl;
#define input freopen("/Users/peteryuanpan/data.txt","r",stdin)
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}

int n;

#define N 100010
#define lch id<<1
#define rch id<<1|1
#define mid ((l+r)>>1)
struct Segment_Tree{
    int ty,lz,num;
    int sum;
}tree[N<<2];

void plant_tree(int id,int l,int r){
    tree[id].ty=1;
    tree[id].lz=0;
    tree[id].num=r-l+1;

    if(l==r){
        tree[id].sum=tree[id].num * tree[id].ty;
        return;
    }

    plant_tree(lch,l,mid);
    plant_tree(rch,mid+1,r);

    tree[id].sum=tree[lch].sum+tree[rch].sum;
}

void pushdown(int id){
    if(tree[id].lz){
        tree[lch].lz=tree[id].lz;
        tree[lch].sum=tree[lch].num * tree[lch].lz;

        tree[rch].lz=tree[id].lz;
        tree[rch].sum=tree[rch].num * tree[rch].lz;

        tree[id].lz=0;
    }
}

void update(int id,int l,int r,int ql,int qr,int v){
    if(ql==l&&qr==r){
        tree[id].lz=v;
        tree[id].sum=tree[id].num * v;
        return;
    }

    pushdown(id);

    if(qr<=mid) update(lch,l,mid,ql,qr,v);
    else if(mid<ql) update(rch,mid+1,r,ql,qr,v);
    else update(lch,l,mid,ql,mid,v),update(rch,mid+1,r,mid+1,qr,v);

    tree[id].sum=tree[lch].sum+tree[rch].sum;
}

int main(){
    //input;
    int T=read();
    for(int kase=1;kase<=T;kase++){
        n=read();

        plant_tree(1,1,n);

        int Q=read();
        for(int iq=1;iq<=Q;iq++){
            int x,y,z;
            x=read(),y=read(),z=read();

            update(1,1,n,x,y,z);
        }

        printf("Case %d: The total value of the hook is %d.\n",kase,tree[1].sum);
    }
    return 0;
}

你可能感兴趣的:(HDU 1698 Just a Hook 线段树 成段替换)