【树状数组】 poj 2352

题意:给出n个平面二维坐标,对于每个坐标,如果这个坐标跟(0,0)形成的矩形内包含的点数为 k (包含边界,但不包含坐标本身),那么这个坐标就是 level k。输出level 0 - n-1的点数分别是多少。

思路:树状数组,线段树  稍后写一个线段树版本

 

#include <stdio.h>
#include <string.h>
#define N 15005
#define M 32005 
int c[M], s[N];
int ans[N];
int n, max ,y;
int lowbit(int x)
{
    return x&(-x);
}

int sum(int x)
{
    int sum=0;
    while(x>0)
    {
        sum+=c[x];
        x-=lowbit(x);
    }
    return sum;
}

void change(int x,int val)
{
    while(x<=max+1)
    {
        c[x]+=val;
        x+=lowbit(x);
    }
}

int main()
{
//    freopen("in.txt", "r", stdin);
    scanf("%d", &n);
    max = 0;
    for(int i=1; i<=n; i++)
    {
        scanf("%d%d", &s[i], &y);
        max = s[i] > max ? s[i] : max;
    }
    memset(ans, 0, sizeof(ans));
    for(int i=1; i<=n; i++)
    {
        ans[sum(s[i]+1)]++;
        change(s[i]+1,1);
    }
    for(int i=0;i<n;i++)
        printf("%d\n", ans[i]);
    return 0;
}

 

posted @ 2014-10-10 09:36  balfish  阅读(113)  评论(0编辑  收藏  举报