hdu1541

http://acm.hdu.edu.cn/showproblem.php?pid=1541

题意:给定一些点,求在这点左下方的点的个数;

思路:此题可以用二维树状数组做,但仔细看题,可以得到给出的y是从小到大的,这样,只需对x进行操作,进而转换为在x左边的点有多少个

代码:

#include<iostream>

using namespace std;

int a[32005],c[32005],n=32005;

int lowbit(int x)

{

	return x&(-x);

}

int sum(int x)

{

	int sum=0;

	while(x>0)

	{

		sum+=c[x];

		x-=lowbit(x);

	}

	return sum;

}

void inster(int x)

{

	while(x<=n)

	{

		c[x]+=1;

		x+=lowbit(x);

	}

}

int main()

{

	int x,y,i,m;

	while(scanf("%d",&m)>0)

	{

		memset(a,0,sizeof(a));

		memset(c,0,sizeof(c));

		for(i=0;i<m;i++)

		{

			scanf("%d%d",&x,&y);

			x++;                   //防止x为0,陷入死循环

			a[sum(x)]++;

			inster(x);

		}

		for(i=0;i<m;i++)

			printf("%d\n",a[i]);

	}

	return 0;

}

 

你可能感兴趣的:(HDU)