该题 的思路:
因为y坐标是递增的 然后 x递增
所以你可以你可以用 树状数组储存 在x位置星星的个数。
每次操作 先 求 x的前缀和, (因为y是递增的)所以前缀和就是 新该星星的级别。
然后再 将该星星的 存进树状数组。
因为有x等于0的情况 所以 你要处理一下 x , 将输入的x加一。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
const long maxn = 1e5;
long c[maxn];
long n;
long lowbit(long x)
{
return x&(-x);
}
void update(long i, long k)
{
while(i <= 32001)
{
c[i]+=k;
i+=lowbit(i);
}
}
long getsum(long i)
{
long res= 0;
while(i> 0)
{
res+=c[i];
i-=lowbit(i);
}
return res;
}
long a[maxn];
long res;
int main()
{
memset(a, 0, sizeof(a));
memset(c, 0 ,sizeof(c));
scanf("%ld", &n);
for(long i = 0;i < n;i++)
{
long x, y;
scanf("%ld %ld",&x, &y);
res = getsum(++x);
a[res]++;
update(x,1);
}
for(long i = 0;i < n;i++)
{
printf("%ld\n", a[i]);
}
return 0;
}