hdu 1698 Just a Hook(线段更新)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

 

#define MAXN 100000*3

struct STNode
{
    int l,r,cover,kink; //记住cover为完全覆盖
};
STNode node[MAXN];

void build(int a,int b,int idx)
{
    node[idx].l=a;
    node[idx].r=b;
    node[idx].cover=1;
    node[idx].kink=1;
    if(a==b) return;
    int mid=(a+b)/2;
    build(a,mid,idx*2);
    build(mid+1,b,idx*2+1);
}
void update(int a,int b,int c,int idx)
{
    if(a==node[idx].l && node[idx].r==b)
    {
        node[idx].cover=1;
        node[idx].kink=c;
        return;
    }
    if(node[idx].cover)
    {
        node[idx].cover=0;
        node[idx*2].cover=node[idx*2+1].cover=1;
        node[idx*2].kink=node[idx*2+1].kink=node[idx].kink;
    }
    if(b<=node[idx*2].r) update(a,b,c,idx*2);
    else if(a>=node[idx*2+1].l) update(a,b,c,idx*2+1);
    else
    {
        update(a,node[idx*2].r,c,idx*2);
        update(node[idx*2+1].l,b,c,idx*2+1);
    }
}
int query(int a,int b,int idx)
{
    if(node[idx].cover)
    {
        return (node[idx].r-node[idx].l+1)*node[idx].kink;
    }
    if(b<=node[idx*2].r) return query(a,b,idx*2);
    else if(a>=node[idx*2+1].l) return query(a,b,idx*2+1);
    else return query(a,node[idx*2].r,idx*2)+query(node[idx*2+1].l,b,idx*2+1);
}

int main()
{
    int T,cas,n,Q,i,j,k;
    scanf("%d",&T);
    for(cas=1; cas<=T; cas++)
    {
        scanf("%d",&n);
        build(1,n,1);
        scanf("%d",&Q);
        while(Q--)
        {
            scanf("%d %d %d",&i,&j,&k);
            update(i,j,k,1);
        }
        printf("Case %d: The total value of the hook is %d.\n",cas,query(1,n,1));
    }
    return 0;
}

posted @ 2010-09-01 17:06  菜到不得鸟  阅读(172)  评论(0)    收藏  举报