题目链接:http://poj.org/problem?id=2352
题目大意:输入n个星星的坐标,数据按y升序输入,星星的level值等于x,y都不大于该星星的星星个数,level不大于32000,要求输出[0,n]等级的星星数;
思路:简单的树状数组题,因为输入数据已经按y升序排列,所以星星的等级等于在它之前所有x坐标不大于它的星星个数,用树状数组实现,调用level函数计算区间[1,x]有多少个星星,即为该星星的等级,再更新[x,32005]内的树状数组的值;利用ans作为计数器存储对应等级的星星数:
代码实现:
#include<stdio.h>
#include<string.h>
int c[33333], ans[16000];
int n;
int lowbit(int x)
{
return x & (-x);
}
void update(int x) //更新所有管辖范围包括x的树状数组c的值
{
while(x <= 32005)
{
c[x] ++;
x += lowbit(x);
}
}
int level(int x) //判定星星的等级
{
int level;
for(level = 0; x > 0; x -= lowbit(x))
level += c[x];
return level;
}
int main()
{
int i, x, y;
scanf("%d", &n);
memset(c, 0, sizeof(c));
memset(ans, 0, sizeof(ans));
for(i = 1; i <= n; i++)
{
scanf("%d%d", &x, &y);
++ans[level(x+1)]; //计算对应等级的星星数
update(x+1);
}
for(i = 0; i < n; i++)
printf("%d\n", ans[i]);
return 0;
}