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;

}





    

 

你可能感兴趣的:(线段树)