POJ-2352 Stars(树状数组)

题目大意:给n个点的坐标,求出每一个点的左下方(允许同一行或同一列)的点的个数。

题目分析:题目中的坐标是先按y从小到大,再按x从小到大给出的。对于坐标 (xi,yi),只需考虑横坐标在0~xi之间的坐标已经出现了几个。用树状数组维护即可。

 

代码如下:

# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std;

const int N=10000;

int cnt[N*3+2005];
int ans[N+5005];

int lowbit(int x)
{
	return x&(-x);
}

void add(int x)
{
	if(x==0) ++cnt[x];
	else{
		while(x<=32000){
			++cnt[x];
			x+=lowbit(x);
		}
	}
}

int query(int x)
{
	int res=0;
	while(x>0){
		res+=cnt[x];
		x-=lowbit(x);
	}
	res+=cnt[0];
	return res;
}

int main()
{
	int n;
	while(~scanf("%d",&n))
	{
		memset(cnt,0,sizeof(cnt));
		memset(ans,0,sizeof(ans));
		int x,y;
		for(int i=0;i<n;++i){
			scanf("%d%d",&x,&y);
			++ans[query(x)];
			add(x);
		}
		for(int i=0;i<n;++i)
			printf("%d\n",ans[i]);
	}
	return 0;
}

  

posted @ 2016-05-05 10:49  20143605  阅读(178)  评论(0编辑  收藏  举报