hdu1541树状数组

题意,计算每颗星左下有多少颗星,不包括自己

注意树状数组不能处理x为0的时候

#include<iostream>
#include <cstring>
#include <cstdio>
using namespace std;

const int MAXN=32005;
int n=32005;
int f[MAXN];
int a[MAXN];//a[i]是横坐标为i的点的个数

int lowbit(int x)
{
    return x&(-x);
}

void add(int x)
{
    while(x<=n)
    {
        f[x]+=1;
        x+=lowbit(x);
    }
}

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

int main()
{
    int x,y,m;
    while(scanf("%d",&m))
    {
        memset(a,0,sizeof(a));
        memset(f,0,sizeof(f));
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&x,&y);
            x++;//防止x为0,陷入死循环
            a[sum(x)]++;
            add(x);
        }
        for(int i=0;i<m;i++)
        printf("%d\n",a[i]);
    }
    return 0;
}

你可能感兴趣的:(hdu1541树状数组)