Description

For example, look at the map shown on the figure above. Level of the star number 5 is equal to 3 (it's formed by three stars with a numbers 1, 2 and 4). And the levels of the stars numbered by 2 and 4 are 1. At this map there are only one star of the level 0, two stars of the level 1, one star of the level 2, and one star of the level 3.
You are to write a program that will count the amounts of the stars of each level on a g.iven map.
Input
Output
Sample Input
51 1
5 1
7 1
3 3
5 5
Sample Output
12
1
1
0
Source::
#include<cstdio>
using namespace std;
#define M 70005
struct Node
{
int l,r;
int n;
}a[M];
int ans[M];
void build(int l,int r,int num)
{
a[num].l=l;
a[num].r=r;
a[num].n=0;
if(l<r)
{
build(l,(l+r)/2,num*2);
build((l+r)/2+1,r,num*2+1);
}
}
void insert(int l,int num)
{
if(a[num].l==l&&a[num].r==l)
{
a[num].n++;
return ;
}
int mid=(a[num].l+a[num].r)/2;
if(l<=mid)
{
insert(l,num*2);
}
else
{
insert(l,num*2+1);
}
a[num].n++;
}
int find(int l,int r,int num)
{
if(a[num].l==l&&a[num].r==r)
{
return a[num].n;
}
int mid=(a[num].l+a[num].r)/2;
if(l>mid)
{
return find(l,r,num*2+1);
}
else if(r<=mid)
{
return find(l,r,num*2);
}
else
{
return find(l,mid,num*2)+find(mid+1,r,num*2+1);
}
}
int main()
{
int x,y,n;
int max=32001;
while(~scanf("%d",&n))
{
build(0,max,1);
for(int i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
ans[find(0,x,1)]++;
insert(x,1);
}
for(int i=0;i<n;i++)
{
printf("%d\n",ans[i]);
}
}
return 0;
}
747



被折叠的 条评论
为什么被折叠?



