hud 1698 线段树(延迟标记)

 这道题居然以dota为背景,很受寝室同学的关注。

自己写的延迟,后来发现错误了,看了ppt的思想,该写了好久。1A

 

#include<stdio.h>
struct st
{
    int l;
    int r;
    int color;
    int num;
}f[100002*4];
int sum1;
#define HH 1
void build(int l,int r,int n)
{
    int mid=(l+r)/2;
    f[n].l=l;
    f[n].r=r;
    f[n].num=1;
    f[n].color=0;
    if(l<r)
    {
        build(l,mid,n*2);
        build(mid+1,r,n*2+1);
    }
}
void update(int l,int r,int num,int n)
{
    int mid=(f[n].l+f[n].r)/2;
    if(f[n].l==l&&f[n].r==r)
    {
        f[n].num=num;
        f[n].color=0;
        return ;
    }
    //if(f[n].num==num) continue; cuo wu
    if(f[n].color==0)
    {
           f[n].color=HH;
         f[n*2].num=f[n].num;
           f[n*2+1].num=f[n].num;
           f[n*2].color=0; //
           f[n*2+1].color=0; //
    }
       if(mid>=r) update(l,r,num,n*2);
    else if(mid<l) update(l,r,num,n*2+1);
    else {
        update(l,mid,num,n*2);
        update(mid+1,r,num,n*2+1);
    }
}
void getsum(int l,int r,int n)
{
    int mid=(f[n].l+f[n].r)/2;
    if(f[n].l==l&&f[n].r==r&&f[n].color==0)
    {
    //    printf("%d %d %d\n",f[n].l,f[n].r,f[n].num);
        sum1=sum1+(f[n].r-f[n].l+1)*f[n].num;
    }
    else if(mid>=r)
        getsum(l,r,n*2);
    else if(mid<l)
        getsum(l,r,n*2+1);
    else {
        getsum(l,mid,n*2);
        getsum(mid+1,r,n*2+1);
    }
}
int main()
{
    int i,t,time,n,m,l,r,num;
    while(scanf("%d",&t)>0)
    {
        time=0;
        while(t--)
        {
            scanf("%d",&n);
            build(1,n,1);
            scanf("%d",&m);
            sum1=0;
            for(i=1;i<=m;i++)
            {
                scanf("%d%d%d",&l,&r,&num);
                update(l,r,num,1);
            }
            getsum(1,n,1);
            printf("Case %d: The total value of the hook is %d.\n",++time,sum1);
        }
    }
    return 0;
}


    

 

posted @ 2013-04-20 10:27  芷水  阅读(209)  评论(0编辑  收藏  举报