Color the ball
Total Submission(s): 9208 Accepted Submission(s): 4709
当N = 0,输入结束。
3 1 1 2 2 3 3 3 1 1 1 2 1 3 0
1 1 1 3 2 1 代码:#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct comp
{
int l,r,mid,x;
}data[400010];
int first;
void bulid(int l,int r,int k)//建树;
{
data[k].l=l;
data[k].r=r;
data[k].mid=(l+r)/2;
data[k].x=0; if(l==r) return ;
bulid(l,data[k].mid,2*k);
bulid(data[k].mid+1,r,2*k+1);
}
void updata(int l,int r,int k)
{ if(data[k].l==l&&data[k].r==r)//如果需要涂色的区间等于该区间,区间内每个气球的涂色次数加1;
{
data[k].x++;
return ;
}
if(r<=data[k].mid)
updata(l,r,2*k);
else if(l>data[k].mid)
updata(l,r,2*k+1);
else {
updata(l,data[k].mid,2*k);
updata(data[k].mid+1,r,2*k+1);
}
}
void search(int k)
{ if(data[k].l==data[k].r)//一个叶子节点,没有下一层了,直接输出
{ if(!first)
printf("%d",data[k].x);//输出的第一个数前面没有空格;
else
printf(" %d",data[k].x);
first=1; return ;
}
data[2*k].x+=data[k].x;//把上一层涂的次数加到下一层上,一直更新到叶子节点
data[2*k+1].x+=data[k].x;
search(2*k);
search(2*k+1);
}
int main()
{ int i,n,a,b; while(scanf("%d",&n),n)
{
bulid(1,n,1); for(i=1;i<=n;i++)
{
scanf("%d%d",&a,&b);
updata(a,b,1);
}
first=0;
search(1);
printf("\n");
} return 0;
}