void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

给出几颗星星的坐标,求出每颗星星不超出他坐标范围的星星有几颗,不包括自己

由于题目给出的坐标是先x后y从小到大给出的序列,因此不用排序直接套模版树状数组~

用x依次来更新其他数据

#include <stdio.h>
#include <string.h>
#define N 16000
#define M 33000
int c[M],num[N];
int lowbit(int x)
{
    return x&(-x);
}
void update(int x)
{
    while(x<M)
    {
        c[x]++;
        x+=lowbit(x);
    }
}
int get(int x)
{
    int sum=0;
    while(x>0)
    {
        sum+=c[x];
        x-=lowbit(x);
    }
    return sum;
}
int main()
{
    int n,x,y;
    while(scanf("%d",&n)!=EOF)
    {
        memset(c,0,sizeof(c));
        memset(num,0,sizeof(num));
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&x,&y);
            x++;//x=0时候,update中会死循环
            update(x);
            num[get(x)-1]++;
        }
        for(int i=0;i<n;i++)
        printf("%d\n",num[i]);

    }

    return 0;
}
posted on 2011-08-03 00:22  void-man  阅读(312)  评论(0)    收藏  举报