poj2352 Stars

给你星星的坐标(y递增,若y相等,x递增),每个星星都有一个等级,规定它的等级就是在它左下方的星星的个数。输入所有星星后,依次输出等级为0到n-1的星星的个数。
思路
统计某个星星左下角有多少星星。
本题给出的数据已经按照y从小到大排好了,所以我们只需要考虑x就行,题意也就成了统计某个星星前面有多少星星。使用树状数组需要注意:给的点的坐标是从0开始的,树状数组中x不能为0,所以我们需要在输入x坐标时加一。


#include <string.h>
#include <stdio.h>
#include <math.h>
#include <queue>
#include <stack>
#include <algorithm>
#define ll long long
using namespace std;
const int maxn=32005;
int ans[maxn],c[maxn];
int lowbit(int x)
{
	return x&(-x);
}
void add(int i,int val)// Add操作,将第i个元素增加val,那么他的父节点也要增加+
{
	while(i<=maxn)
	{
		c[i]+=val;
		i+=lowbit(i);//i的父节点
	}
}
int sum(int i)
{
	int s=0;
	while(i>0)
	{
		s+=c[i];
		i-=lowbit(i);
	}
	return s;
}
int main()
{
	int i,j,n;
	scanf("%d",&n);
	int x,y;
	for (i=1; i<=n; i++)
	{
		scanf("%d%d",&x,&y);
		x++;
		ans[sum(x)]++;//sum算出x的级别,然后ans计数 
		add(x,1);
	}
	for (i=0; i<n; i++)//级别从0->n-1的行星数量 
		printf("%d
",ans[i]);

	return 0;
}

原文地址:https://www.cnblogs.com/shidianshixuan/p/14427247.html