#178-[暴力]数星星Stars

版权声明:反正也没有人会转,下一个 https://blog.csdn.net/drtlstf/article/details/84667350

Description

原题来自:Ural 1028 
天空中有一些星星,这些星星都在不同的位置,每个星星有个坐标。如果一个星星的左下方(包含正左和正下)有 kkk 颗星星,就说这颗星星是 k 级的。 
stars1.png 
例如,上图中星星 5是 3 级的(1,2,4 在它左下),星星 2,4 是 1 级的。例图中有 1 个 0 级,2 个 1 级,1 个 2 级,1 个 3 级的星星。 
给定星星的位置,输出各级星星的数目。 
一句话题意 \ 给定 n 个点,定义每个点的等级是在该点左下方(含正左、正下)的点的数目,试统计每个等级有多少个点。 

Input

第一行一个整数 N,表示星星的数目;
接下来 N 行给出每颗星星的坐标,坐标用两个整数 x,y 表示;
不会有星星重叠。星星按 y 坐标增序给出,y 坐标相同的按 x 坐标增序给出。 

Output

N 行,每行一个整数,分别是 0 级,1 级,2 级,……,N−1 级的星星的数目。 

5
1 1
5 1
7 1
3 3
5 5
  • Sample Input

1
2
1
1
0
  • Sample Output

HINT

对于全部数据,1≤N≤1.5×104,  0≤x,y≤3.2×104 

Source/Category

树状数组 // ???

数据范围......N^2应该能过

#include <iostream>
#include <cstdio>

#define SIZE 15010

using namespace std;

int x[SIZE], y[SIZE], c[SIZE];

int main(void)
{
	int n, i, j, tot;
	
	scanf("%d", &n);
	for (i = 1; i <= n; ++i)
	{
		scanf("%d%d", &x[i], &y[i]);
	}
	
	for (i = 1; i <= n; ++i)
	{
		tot = -1; // 一开始是 -1, 因为之后这颗星本身也被统计了.
		for (j = 1; j <= n; ++j)
		{
			if ((x[j] <= x[i]) && (y[j] <= y[i])) // 在左下方
			{
				++tot; // 计数器 + 1
			}
		}
		++c[tot]; // 级别个数 + 1
	}
	
	for (i = 0; i < n; ++i)
	{
		printf("%d\n", c[i]); // 输出
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/drtlstf/article/details/84667350