POJ-2352-Stars
http://poj.org/problem?id=2352
给出n个星星的坐标,如果一个星星的左下方(包含正左和正下)有k颗星星,就说这颗星星是k级的,统计每个等级有多少个点。这题可用树状数组,对于每个星星按y坐标从小到大排序,相同y坐标按x坐标从小到大排序(题目中数据已经有序),输入顺序已排好序,那么只要依次统计星星i之前x坐标小于等于i.x的星星有多少,即是星星i的级别
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 35000
#define M 16000
int c[N],ans[M];
int n;
int lowbit(int x)
{
return x&(x^(x-1));
}
void update(int p,int x)
{
while(p<=32001)
{
c[p]+=x;
p+=lowbit(p);
}
}
int sum(int p) //统计p坐标以前的星星个数
{
int sum=0;
while(p>0)
{
sum+=c[p];
p-=lowbit(p);
}
return sum;
}
int main()
{
int i,x,y;
scanf("%d",&n);
memset(c,0,sizeof(c));
memset(ans,0,sizeof(ans));
for(i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
++ans[sum(x+1)];
update(x+1,1);
}
for(i=0;i<n;i++)
printf("%d\n",ans[i]);
return 0;
}