http://poj.org/problem?id=2352
题意:
给你一些星星的坐标,按Y优先X次优先的顺序给的,定义每个星星(Xi,Yi)的级别为<xi&&<yi的星星个数。求每个级别有多少星星
思路:
因为坐标是按y顺序给出的,所以一层层的按顺序加到树状数组中,每加一次求一次Sum,即为该点的级别值。
我的代码:
#include<stdio.h>
#define lowbit(i) (i)&(-i)
int c[32005],i,x,y,n,ans[15005];
void Add(int i,int val,int n)
{
for(;i<=n;i+=lowbit(i)) c[i]+=val;
}
int Sum(int i)
{
int ret=0;
for(;i>0;i-=lowbit(i)) ret+=c[i];
return ret;
}
int main()
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
ans[Sum(x+1)]++;
Add(x+1,1,32001);//要更新到32001,因为X+1了
}
for(i=0;i<n;i++)
printf("%d\n",ans[i]);
return 0;
}
/*第一次写数状数组啊,开始更新那里错了,WA^n。。。 */