QOJ.ac

QOJ

Límite de tiempo: 5.0 s Límite de memoria: 1024 MB Puntuación total: 100 Hackeable ✓

#17955. UCP-Clustering

Estadísticas

聚类算法是将数据划分为被称为“簇”(cluster)的子集的算法,旨在将相似的数据放入同一个簇中,而将不同的数据放入不同的簇中。

Jihoon Ko 教授发现了一种革命性的聚类算法——UCP-Clustering。给定二维空间中的 $N$ 个互不相同的点,该算法通过以下步骤将这些点划分为 $K$ 个簇:

  • 每个簇都被分配一个代表坐标(Representative Coordinate,简称 RC),供后续使用。初始时,从给定的 $N$ 个点中选择 $K$ 个点,每个簇的 RC 对应其中一个被选中的点。尽管这些坐标是从给定的点中选择的,但此时所有簇都是空的。
  • 重复执行以下重计算算法 recompute
    • 对于每个点,将其插入到与其 RC 距离最小的簇中。如果有多个这样的簇,则选择其中 RC 字典序最小的簇。
    • 对于每个簇,重新计算其 RC。新 RC 的 $x$ 坐标是该簇中所有点 $x$ 坐标的中位数。类似地,$y$ 坐标是该簇中所有点 $y$ 坐标的中位数。
    • 如果所有簇的 RC 都没有发生变化,则算法终止。否则,清空所有簇,并再次运行 recompute 算法(清空操作不会重新初始化 RC)。

此处使用以下定义:

  • 点 $(x_1, y_1)$ 在字典序上小于 $(x_2, y_2)$ 当且仅当 $x_1 < x_2$,或 $x_1 = x_2$ 且 $y_1 < y_2$。
  • 对于一个长度为 $n > 0$ 的序列,中位数定义为:若 $n$ 为奇数,则为第 $(n + 1)/2$ 大的值;若 $n$ 为偶数,则为第 $n/2$ 大和第 $n/2 + 1$ 大的值的平均值。

例如,考虑将 $N = 3$ 个点 $\{(1, 2), (3, 4), (5, 6)\}$ 聚类为 $K = 2$ 个集合的情况。 假设选择点 $(1, 2)$ 和 $(3, 4)$ 作为初始 RC。recompute 算法的第一次迭代将点聚类为 $\{(1, 2)\}$ 和 $\{(3, 4), (5, 6)\}$,它们的 RC 分别变为 $(1, 2)$ 和 $(4, 5)$。第二次迭代没有改变 RC,因此 recompute 算法共执行了两次。 假设选择点 $(1, 2)$ 和 $(5, 6)$ 作为初始 RC。那么 recompute 算法的第一次迭代将点聚类为 $\{(1, 2), (3, 4)\}$ 和 $\{(5, 6)\}$,它们的 RC 分别变为 $(2, 3)$ 和 $(5, 6)$。第二次迭代没有改变 RC,因此 recompute 算法共执行了两次。 从上述例子中可以看出,RC 的初始选择可能会改变聚类的结果。

在本题中,我们关注 $K = 2$ 的情况。假设等概率地从所有 $N(N - 1)/2$ 种可能的初始代表坐标选择中为每个簇选择初始 RC。请找出算法结束时所有可能的代表坐标集合,以及如果算法达到该集合,recompute 执行次数的期望值。

输入格式

第一行包含一个整数 $N$ ($2 \le N \le 512$)。

接下来的 $N$ 行,每行包含两个整数 $x_i$ 和 $y_i$,表示点 $(x_i, y_i)$。所有点互不相同($-10^6 \le x_i, y_i \le 10^6$)。

输出格式

输出所有可能的代表坐标集合,每行一个,格式如下:

设 $(x_1, y_1), (x_2, y_2)$ 为最终的代表坐标。输出五个实数 $x_1, y_1, x_2, y_2, E$,其中 $(x_1, y_1)$ 在字典序上小于 $(x_2, y_2)$,且 $E$ 是算法达到该代表坐标集合时 recompute 算法执行次数的期望值。

输出的集合必须按照 $(x_1, y_1)$ 的字典序升序排列;对于具有相同 $(x_1, y_1)$ 的集合,按照 $(x_2, y_2)$ 的字典序升序排列。

所有数值的绝对误差或相对误差必须在 $10^{-6}$ 以内。

输入数据保证,任何初始 RC 的选择都不会使算法达到满足以下任一条件的某种状态:

  • 某个簇变为空。
  • recompute 算法被无限次调用。
  • 两个或多个簇具有相同的 RC。

样例

输入样例 1

4
0 0
0 3
3 0
3 3

输出样例 1

0.000000 0.000000 3.000000 3.000000 1.000000000000
0.000000 1.500000 3.000000 1.500000 2.000000000000
0.000000 3.000000 3.000000 0.000000 1.000000000000
1.500000 0.000000 1.500000 3.000000 2.000000000000

输入样例 2

3
1 2
3 4
5 6

输出样例 2

1.000000 2.000000 4.000000 5.000000 2.000000000000
2.000000 3.000000 5.000000 6.000000 2.000000000000

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.