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作为计数器存储对应等级的星星数:
代码实现:
题目大意:输入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; }
相关文章推荐
- POJ 2352 Stars
- POJ 2352 Stars
- poj2352 Stars (树状数组)
- poj 2352 && hdu 1541 Stars (树状数组)
- Poj 2352 Stars 题解
- POJ - 2352 Stars(树状数组求解逆序对)
- POJ 2352 - Stars
- poj2352 Stars 树状数组
- POJ---2352-Stars(树状数组)
- POJ 2352 Stars
- POJ_2352 Stars(树状数组)
- poj 2352 Stars(树状数组)
- poj-2352-stars
- poj2352 Stars (第一道树状数组
- poj 2352 Stars(线段树 )
- POJ2352 Stars
- poj2352 Stars(树状数组)
- POJ 2352 Stars(树状数组)
- POJ 2352 Stars【树状数组】
- POJ 2352 Stars