HDU1556-color the ball(线段树)


题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556


#include<cstdio>
using namespace std;
struct node
{
    int start;
    int end;
    int num;
};
node q[500000];
void built(int s,int e,int key)
{
    q[key].start=s;
    q[key].end=e;
    q[key].num=0;
    if(s==e)
    {
        return;
    }
    int mid=(s+e)/2;
    built(s,mid,2*key);
    built(mid+1,e,2*key+1);
}
void updata(int i,int j,int key)
{
    if(q[key].start==i&&q[key].end==j)
    {
        q[key].num++;
        return;
    }
    int mid=(q[key].start+q[key].end)/2;
    if(i<=mid&&j>mid)
    {
        updata(i,mid,2*key);
        updata(mid+1,j,2*key+1);
    }
    else
    {
        if(i<=mid)
        updata(i,j,2*key);
        if(j>mid)
        updata(i,j,2*key+1);
    }
}
void insert(int i,int j,int key)
{
    if(key!=1)
    q[key].num+=q[key/2].num;
    if(q[key].start==q[key].end)
    {
        return;
    }
    int mid=(q[key].start+q[key].end)/2;
    if(i<=mid)
    insert(i,j,2*key);
    if(j>mid)
    insert(i,j,2*key+1);
}
int check(int i,int key)
{
    if(q[key].start==q[key].end)
    return q[key].num;
    int mid=(q[key].start+q[key].end)/2;
    if(i<=mid)
    check(i,2*key);
    else
    check(i,2*key+1);
}
int main()
{
    int N,a,b,i;
    while(scanf("%d",&N)&&N)
    {
        built(1,N,1);
        for(i=1;i<=N;i++)
        {
            scanf("%d%d",&a,&b);
            updata(a,b,1);
        }
        insert(1,N,1);
        printf("%d",check(1,1));
        for(i=2;i<=N;i++)
        printf("% d",check(i,1));
        printf("\n");
    }
    return 0;
}

 





 

posted on 2016-03-20 15:24  polarday  阅读(132)  评论(0编辑  收藏  举报

导航