您的位置:首页 > 其它

Poj 2352 Stars

2013-03-30 00:59 344 查看
题目链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: