题目意思就是求每个星星左下方的星星的个数,由于y轴已经排序好了,我们可以直接用按x轴建立一维树状数组,然后求相当于它前面比它小的个数,模板直接一套就搞定了~~
#include <iostream>
using namespace std;
const int MAX = 32000 + 10;
int c[MAX], level[MAX];
int Lowbit(int x)
{
return x & (-x);
}
void Update(int x)
{
while( x < MAX )
{
c[x]++;
x += Lowbit(x);
}
}
int Getsum(int x)
{
int sum = 0;
while( x > 0 )
{
sum += c[x];
x -= Lowbit(x);
}
return sum;
}
int main()
{
int n;
while(~scanf("%d", &n))
{
memset(c,0, sizeof(c));
memset(level, 0, sizeof(level));
int x, y;
for(int i = 1; i <= n; i++)
{
scanf("%d%d", &x, &y);
x++;//否则x等于的时候会陷入死循环
level[Getsum(x)]++;
Update(x);
}
for(int i = 0; i < n; i++)
printf("%d\n", level[i]);
}
return 0;
}

本文介绍了一种使用一维树状数组来解决寻找每个星星左下方星星数量的问题,通过排序和计数操作,实现了高效计算。代码示例清晰易懂,适合算法学习者和编程爱好者。
838

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



