Poj 2352 Stars

来源:互联网 发布:学号 姓名 性别 sql 编辑:程序博客网 时间:2024/06/07 08:21

题目链接: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;}


原创粉丝点击