分析:给你n颗星星,让你输入星星等级分别为0~n-1的星星数,一颗星星等级就是这个星星左下角的星星数,不包含这颗星星本身,包含在同一水平线或同一竖直线上的点。因为星星的y是递增的,y相同则x递增,所以一颗星星的等级就是除这颗星星外的其他星星的横坐标小于等于这颗星星的星星数。可以用树状数组很快的解出来。
# include <stdio.h>
# include <string.h>
int c[32005],level[32005];
int lowbit(int x)
{
return x&(-x);
}
int sum(int n)
{
int s=0;
while(n>0)
{
s+=c[n];
n-=lowbit(n);
}
return s;
}
void update(int i,int value)
{
while(i<32005)
{
c[i]+=value;
i+=lowbit(i);
}
}
int main()
{
int i,x,y,n;
scanf("%d",&n);
memset(c,0,sizeof(c));
memset(level,0,sizeof(level));
for(i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
x++;
level[sum(x)]++;
update(x,1);
}
for(i=0;i<=n-1;i++)
printf("%d\n",level[i]);
return 0;
}

本文介绍了一种利用树状数组解决星星等级分配问题的方法。通过输入星星的等级和位置,快速计算并输出每个等级星星的数量。该算法效率高,适用于大规模数据处理。

被折叠的 条评论
为什么被折叠?



