HDU 1698 Just a Hook

转载请注明出处:http://blog.csdn.net/a1dark

分析:说到这题、满脸都是泪。。、本应该轻松1A的、结果由于我的初始化mark的时候、没注意到就把mark放到if(l==r)条件判断里面了、这样就只能初始化到最低层的节点、无语了啊、找了好久的错误、泪流满面。。

其实这题还有一个做法、因为是不断覆盖、可以逆序模拟这个过程、是可以暴力过的

#include<stdio.h>
#define N 100225
struct node{
    int l,r;
    int sum,mark;
}tree[N<<2];
int n,ans;
void create(int x,int l,int r){
    tree[x].l=l;
    tree[x].r=r;
    tree[x].mark=0;
    int mid=(l+r)/2;
    if(l==r){
        tree[x].sum=1;
        return;
    }
    create(x*2,l,mid);
    create(x*2+1,mid+1,r);
    tree[x].sum=tree[x*2].sum+tree[x*2+1].sum;
}
void pushdown(int x){
    if(tree[x].mark){
        tree[x*2].mark=tree[x].mark;
        tree[x*2+1].mark=tree[x].mark;
        tree[x*2].sum=(tree[x*2].r-tree[x*2].l+1)*tree[x].mark;
        tree[x*2+1].sum=(tree[x*2+1].r-tree[x*2+1].l+1)*tree[x].mark;
        tree[x].mark=0;
    }
}
void update(int x,int l,int r,int num){
    if(l<=tree[x].l&&r>=tree[x].r){
        tree[x].mark=num;
        tree[x].sum=num*(tree[x].r-tree[x].l+1);
        return;
    }
    pushdown(x);
    int mid=(tree[x].l+tree[x].r)/2;
    if(l<=mid)
        update(x*2,l,r,num);
    if(r>mid)
        update(x*2+1,l,r,num);
    tree[x].sum=tree[x*2].sum+tree[x*2+1].sum;

}
int main(){
    int t,m,i,x,y,num,k=1;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        create(1,1,n);
        for(i=1;i<=m;i++){
            scanf("%d%d%d",&x,&y,&num);
            update(1,x,y,num);
        }
        printf("Case %d: The total value of the hook is %d.\n",k,tree[1].sum);
        k++;
    }
    return 0;
}




你可能感兴趣的:(线段树,ACM,成段更新)