您的位置:首页 > 其它

树状数组简单题(POJ2352,HDU1541)

2012-03-11 10:10 302 查看
POJ2352,HDU1541 Stars



给出N个点的X,Y坐标(按照Y升序,X升序的顺序给出),对于每个点输出有多少个点在该点的左下方。如图中的点5就有3个(1,2,4)点在它的左下方。

由于题目给出的数据已经是排好序的了,按照这个序列,一个点的左下方的点一定在它的前面出现。所以问题就转化成询问该点之前的所有点中有多少个点的X坐标小于等于该点X坐标。

所以只要先查询比X坐标小的点的个数记录到数组中,然后更新。
#include <stdio.h>
#include <memory.h>
#define N 15004
#define M 32004
#define lowbit(x) ((x)&(-x))
int a
,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: