题解:题目数据中点按照y轴升序给出。而对于点(x,y)的左下方点的个数就是xi<=x,yi<=y的点的个数。在题中对于任意 xi 只用求得 xj<=xi,(j<=i)的 j 的个数。 最后放入level数组中统计每个等级的点的个数。
ac代码:
#include<cstdio>
#include<cstring>
#define maxn 32000+10
int bit[maxn];
int level[maxn/2];
int sum(int x)
{
int ans=0;
while(x>0)
{
ans+=bit[x];
x-=(x&-x);
}
return ans;
}
void add(int x)
{
while(x<=maxn)
{
bit[x]+=1;
x+=(x&-x);
}
}
int main()
{
int n,i,x,y;
while(scanf("%d",&n)!=EOF)
{
memset(bit,0,sizeof(bit));
memset(level,0,sizeof(level));
for(i=0;i<n;++i)
{
scanf("%d%d",&x,&y);
x++;//这里是允许x坐标为0的,所以将每个点横坐标都加1
level[sum(x)]++;
add(x);
}
for(i=0;i<n;++i)
printf("%d\n",level[i]);
}
return 0;
}