跳到主要内容

P4800. 亲近度排名矩阵

场次:2026年4月18日-开发岗 · 来源:CodeFun2000 P4800

题目描述​

在一项地理数据分析中,收集了 nn 个地点的坐标,每个地点 ii 对应两个整数坐标 (xi,yi)(x_i, y_i)。

对任意两个不同的地点 ii 和 jj,定义它们的亲近度为

d(i,j)=(xi−xj)2+(yi−yj)2d(i,j) = (x_i - x_j)^2 + (y_i - y_j)^2

亲近度越小表示两点越接近。

对于每个地点 ii,考虑所有 j≠ij \ne i 并按亲近度从小到大排序。如果另有 k≠i,jk \ne i,j 满足 d(i,k)≤d(i,j)d(i,k) \le d(i,j),则称 kk 是 ii 到 jj 的一个“近邻”。记 S(i,j)S(i,j) 为这些近邻的个数。形式化定义:

  • 若 i≠ji \ne j,S(i,j)=#{k∣k≠i,k≠j,d(i,k)≤d(i,j)}S(i,j) = \#\{ k \mid k \ne i, k \ne j, d(i,k) \le d(i,j) \};
  • S(i,i)=0S(i,i) = 0。

你的任务是:对于给定的 nn 个地点,计算出 n×nn \times n 的矩阵 SS。

约束条件:

  • 测试数据组数 TT 不超过 100100;
  • 每组数据的地点数 n≥1n \ge 1,且所有组的 nn 之和不超过 20002000;
  • 所有坐标均为不超过 10910^9 的正整数。

输入格式​

第一行包含一个整数 TT,表示测试数据组数。 对于每组数据:

  • 第一行包含一个整数 nn,表示地点的个数;
  • 接下来的 nn 行,每行包含两个整数 xi,yix_i, y_i,表示第 ii 个地点的坐标。

保证所有测试数据中 nn 的总和不超过 20002000。

输出格式​

对于每组数据,输出 nn 行,每行包含 nn 个整数,表示矩阵 SS 的对应行。第 ii 行的第 jj 个整数表示 S(i,j)S(i,j)。同一行内的整数以单个空格分隔。各组测试数据的输出之间不需要额外的空行。

示例​

示例 1​

输入:

1
1
10 20

输出:

0

说明:

只有 1 个地点,根据定义 S(1,1)=0S(1,1)=0,因此直接输出 0。

示例 2​

输入:

1
3
1 1
2 2
3 3

输出:

0 0 1
1 0 1
1 0 0

说明:

共有 3 个地点,坐标分别为 (1,1),(2,2),(3,3)(1,1), (2,2), (3,3)。

对地点 1((1,1)(1,1)):

  • 与地点 2 的距离平方 d(1,2)=2d(1,2)=2,没有其他点满足 ≤2\le 2,故 S(1,2)=0S(1,2)=0。
  • 与地点 3 的距离平方 d(1,3)=8d(1,3)=8,地点 2 满足 d(1,2)=2≤8d(1,2)=2 \le 8,故 S(1,3)=1S(1,3)=1。

对地点 2((2,2)(2,2)):

  • 与地点 1 的距离平方 d(2,1)=2d(2,1)=2,与地点 3 的距离平方 d(2,3)=2d(2,3)=2,两者距离相同。排序后该组最后一个位置为 1,故 S(2,1)=S(2,3)=1S(2,1)=S(2,3)=1。

对地点 3((3,3)(3,3)):

  • 与地点 2 的距离平方 d(3,2)=2d(3,2)=2,无其他点满足 ≤2\le 2,故 S(3,2)=0S(3,2)=0。
  • 与地点 1 的距离平方 d(3,1)=8d(3,1)=8,地点 2 满足 d(3,2)=2≤8d(3,2)=2 \le 8,故 S(3,1)=1S(3,1)=1。

对角线恒为 0。

示例 3​

输入:

1
3
0 0
0 1
1 0

输出:

0 1 1
0 0 1
0 1 0

说明:

三个地点构成等腰直角三角形。

对地点 1 (0,0)(0,0):到地点 2 的距离平方为 1,到地点 3 的距离平方也为 1,两者相同,排序后组内最后一个位置为 1,因此 S(1,2)=S(1,3)=1S(1,2)=S(1,3)=1。

对地点 2 (0,1)(0,1):到地点 1 的距离平方为 1(位置 0),到地点 3 的距离平方为 2(位置 1),故 S(2,1)=0S(2,1)=0,S(2,3)=1S(2,3)=1。

对称地,地点 3 (1,0)(1,0) 的结果为 S(3,1)=1S(3,1)=1,S(3,2)=0S(3,2)=0。

所有对角线元素均为 0。

加载评论中...