hdu 1698(种一颗区间树)

简单题。。。。区间更新  查找节点。。。。lazy思想想了好长时间,弄懂了。。果然很强大。。。



#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define N 400010
#define LL(x) (x<<1)
#define RR(x) (x<<1|1)
struct node{
    int L,R,sum,col;
}edge[N];
void pushdown(int i,int m){
    edge[LL(i)].col=edge[RR(i)].col=edge[i].col;
    edge[LL(i)].sum=edge[i].col*(m-(m>>1));
    edge[RR(i)].sum=edge[i].col*(m>>1);
    edge[i].col=0;
}
int buit(int l,int r,int i){
    edge[i].L=l,edge[i].R=r,edge[i].col=0;
    if(l==r) return edge[i].sum=1;
    int mid=(l+r)>>1;
    return edge[i].sum=buit(l,mid,LL(i))+buit(mid+1,r,RR(i));
}
void updata(int l,int r,int i,int x){
    if(l<=edge[i].L && edge[i].R<=r){
        edge[i].col=x,edge[i].sum=x*(edge[i].R-edge[i].L+1);
        return;
    }
    if(edge[i].col) pushdown(i,edge[i].R-edge[i].L+1);
    int mid=(edge[i].L+edge[i].R)>>1;
    if(l<=mid) updata(l,r,LL(i),x);
    if(r>mid) updata(l,r,RR(i),x);
    edge[i].sum=edge[LL(i)].sum+edge[RR(i)].sum;
}
int main(){
    int cas,n,m,x,y,u;
    scanf("%d",&cas);
    for(int t=1;t<=cas;t++){
        scanf("%d%d",&n,&m);
        buit(1,n,1);
        while(m--){
            scanf("%d%d%d",&x,&y,&u);
            updata(x,y,1,u);
        }
        printf("Case %d: The total value of the hook is %d.\n",t,edge[1].sum);
    }
    return 0;
}


你可能感兴趣的:(hdu 1698(种一颗区间树))