1265. 数星星

在这里插入图片描述
在这里插入图片描述
思路:
在这里插入图片描述
因为题意星星按 y 坐标增序给出,y 坐标相同的按 x 坐标增序给出,所以只需要考虑每个横坐标x一共对应一共有几颗星星,然后求0~x的前缀和就可以得到每一级星星的数量
代码:

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

const int N = 32010;
int n;
int level[N],tr[N];//tr[i]表示该横坐标下有多少个星星,level[]表示第i级星星的数目

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

void add(int x)
{
    
    
    for(int i = x;i < N;i += lowbit(i))
    {
    
    
        tr[i]++;//放入一个星星,则后续所有相关的数目都加一
    }
}

int sum(int x)
{
    
    
    int res = 0;
    for(int i = x;i;i -= lowbit(i))
    {
    
    
        res += tr[i];
    }
    return res;
}

int main()
{
    
    
    int x,y;
    cin >> n;
    for(int i = 1;i <= n;i++)
    {
    
    
        scanf("%d %d",&x,&y);
        x++;//树状数组初始应该为1
        level[sum(x)]++;//第x级星星的数量
        add(x);//放入该星星
    }
    for(int i = 0;i < n;i++)
    printf("%d\n",level[i]);
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45812180/article/details/114797169