//题意:统计每个给定点的左下方(包括正左和正下)的点的个数.
#include<stdio.h>
#include<string.h>
#define max 32100
int ans[max],pox[max];
int lowBit(int n)
{
return n&(-n);
}
//如果是x-=x&(-x);就是得到x这个点的管辖区间的下个区间的管辖点;
int getSum(int x)
{
int sum=0;
while(x>0)
{
sum+=pox[x];
x-=lowBit(x);
}
return sum;
}
//如果是x+=x&(-x);就是得到的改点的父节点的值;比如x=4时;就能得到8;
void upDate(int x)
{
while(x<max)
{
pox[x]++;
x+=lowBit(x);
}
}
int main()
{
int t;
int x,y;
while(scanf("%d",&t)!=EOF)
{
memset(ans,0,sizeof(ans));
memset(pox,0,sizeof(pox));
for(int i=0; i<t; i++)
{
scanf("%d%d",&x,&y);
ans[getSum(x+1)]++;
upDate(x+1);
}
for(int i=0; i<t; i++)
printf("%d\n",ans[i]);
}
return 0;
}
poj2352 树状数组简单题
最新推荐文章于 2018-10-12 11:53:00 发布