POJ2352,HDU1541 Stars
由于题目给出的数据已经是排好序的了,按照这个序列,一个点的左下方的点一定在它的前面出现。所以问题就转化成询问该点之前的所有点中有多少个点的X坐标小于等于该点X坐标。
所以只要先查询比X坐标小的点的个数记录到数组中,然后更新。
#include <stdio.h>
#include <memory.h>
#define N 15004
#define M 32004
#define lowbit(x) ((x)&(-x))
int a[N],c[M];
void update(int p)
{
while(p<M){
c[p]++;
p+=lowbit(p);
}
}
int sum(int p)
{
int ans=0;
while(p)
{
ans+=c[p];
p-=lowbit(p);
}
return ans;
}
int main()
{
int n,i,x,y;
while(scanf("%d",&n)!=EOF)
{
memset(c,0,sizeof(c));
memset(a,0,sizeof(a));
for(i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
x++;
a[sum(x)]++;
update(x);
}
for(i=0;i<n;i++) printf("%d\n",a[i]);
}
return 0;
}