poj 2352 Stars
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 22249 | Accepted: 9689 |
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 given map.
Input
Output
Sample Input
5 1 1 5 1 7 1 3 3 5 5
Sample Output
1 2 1 1 0
Hint
Source
树状数组的做法是,每读入一组坐标,先算出其level,再更新数组.最后输出的是各level星星数.注意树状数组是从1开始的所以x要+1.数组也不要开小.
AC代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define maxn 32060
int c[maxn];
int level[maxn];
int n;
int lowbit( int i)
{
return i&(-i);
}
void updata( int i)
{
while(i<=maxn)
{
c[i]+=1;
i+=lowbit(i);
}
}
int sum( int i)
{
int s=0;
while(i>0)
{
s+=c[i];
i-=lowbit(i);
}
return s;
}
int main( )
{
memset(c,0,sizeof(c));
memset(level,0,sizeof(c));
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int x,y;scanf("%d%d",&x,&y);
++x;
++level[sum(x)];
//printf("sum = %d level[sum(%d)] = %d\n",sum(x),x,++level[sum(x)]);
updata(x);
}
for(int i=0;i<n;i++)
{
printf("%d\n",level[i]);
}
// system("pause");
return 0;
}