HDU 1541 Stars

题目链接:HDU 1541 Stars

树状数组。

x坐标范围为树状数组下标范围。

因为是按照y升序输入的,那么只要一个点是当前输入的点之前输入的而且该点的x小于当前输入的x,那么这个点就是当前输入点的左下方的点。

注意如果某个点的x是0,那么就会出现死循环。所以代码中均对x做了+1操作。在这我突然明白了为什么树状数组的下标要从1开始,原因是如果lowbit的参数是0,那么lowbit永远返回的是0,然后就是死循环。

还要注意sum(x)包括当前输入的点,所以需要-1。

#include <iostream>
#include <stdio.h>
#include <cstring>

using namespace std;

const int MAX_N = 15000 + 10;
const int MAX_X = 32000 + 10;

int arr[MAX_N],num[MAX_X],level[MAX_N];
int N;

int lowbit(int i)
{
    return i & (-i);
}
int sum(int i)
{
    int ans = 0;
    while(i > 0)
    {
        ans += num[i];
        i -= lowbit(i);
    }
    return ans;
}
void add(int i,int val)
{
    while(i < MAX_X)
    {
        num[i] += val;
        i += lowbit(i);
    }
}
int main()
{
    while(scanf("%d",&N) != EOF)
    {
        memset(num,0,sizeof(num));
        memset(level,0,sizeof(level));
        for(int i = 1;i <= N;i++)
        {
            int x,y;
            scanf("%d %d",&x,&y);
            x++;
            add(x,1);
            level[sum(x) - 1]++;
        }
        for(int i = 0;i < N;i++)
            printf("%d\n",level[i]);
    }
    return 0;
}



你可能感兴趣的:(HDU 1541 Stars)