Description
原题来自:Ural 1028
天空中有一些星星,这些星星都在不同的位置,每个星星有个坐标。如果一个星星的左下方(包含正左和正下)有 kkk 颗星星,就说这颗星星是 k 级的。
例如,上图中星星 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;
}