题目意思就是求每个星星左下方的星星的个数,由于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;
}