码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2352 Stars

时间:2015-05-14 20:30:54      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

题意:有一堆星星,每个星星的级别为坐标不高于它且不在它右边的星星个数,求级别为0~n - 1的星星个数。

 

解法:树状数组。输入的星星坐标已经按y坐标升序排序,y坐标相等的按x升序排序,所以每输入一个数只要看之前输入的星星里有几个x坐标小于等于它的x坐标即为它的等级,等级计数器加一,把这个星星的x坐标加入树状数组,最后扫一遍等级计数器输出。并没注意到x坐标有0这种坑爹的事情……果断T了……

 

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long
using namespace std;
int BA[32005];
int n;
inline int lowbit(int x)
{
    return x & (-x);
}
void update(int pos)
{
    for(int i = pos; i <= 32005; i += lowbit(i))
        BA[i]++;
}
int query(int pos)
{
    int res = 0;
    for(int i = pos; i > 0; i -= lowbit(i))
        res += BA[i];
    return res;
}
int main()
{
    while(~scanf("%d", &n))
    {
        memset(BA, 0, sizeof BA);
        int ans[15005] = {0};
        for(int i = 0; i < n; i++)
        {
            int x, y;
            scanf("%d%d", &x, &y);
            x++;
            ans[query(x)]++;
            //cout << "q = " << query(x) << endl;
            update(x);
        }
        for(int i = 0; i < n; i++)
            printf("%d\n", ans[i]);
    }
    return 0;
}

  

POJ 2352 Stars

标签:

原文地址:http://www.cnblogs.com/Apro/p/4504234.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!