关闭

poj 2352 Stars (树状数组)

标签: 树状数组
272人阅读 评论(0) 收藏 举报
分类:

题目;http://poj.org/problem?id=2352

题意:给定n个点的坐标(x,y),n个点按y坐标从小到大输入,如果y坐标相等的按x坐标从小到大输入。统计每个点的左下方有多少个点(包括左边和下边),输出统计数为0的个数、统计数为1的个数...统计数为n-1的有多少个。

分析:对于任意一个点p(x,y),在p的左下方的点t(x',y')的纵坐标y'肯定≤y,那么问题就转化为,对于所有的点,在之前输入的点里面统计横坐标小于x的点的个数(由于输入有序,纵坐标其实没用)。那么用树状数组就很容易解决了,不过注意x可能等于0,0+lowbit(0)==0,会导致死循环,将所有的点向由平移1个点位就行了。

代码:

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

const int INF = 32005;

int tree[INF],ans[INF];

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

void update(int x,int v)
{
	for(int i=x;i<INF;i+=lowbit(i))
		tree[i]+=v;
}

int query(int x)
{
	int ret(0);
	for(int i=x;i>0;i-=lowbit(i))
		ret+=tree[i];
	return ret;
}

int main()
{
	int n,i,j,x,y;
	while(scanf("%d",&n)!=EOF)
	{
		memset(tree,0,sizeof(tree));
		memset(ans,0,sizeof(ans));
		for(i=0;i<n;i++)
		{
			scanf("%d%d",&x,&y);
			++ans[query(x+1)];
			update(x+1,1);
		}
		for(i=0;i<n;i++)
			printf("%d\n",ans[i]);
	}
	return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:69710次
    • 积分:2648
    • 等级:
    • 排名:第13817名
    • 原创:201篇
    • 转载:2篇
    • 译文:0篇
    • 评论:5条
    最新评论