一位旅行推销员收到了一份他必须在单次行程中访问的城市列表。他可以在任何城市开始和结束他的行程,只要他至少访问每个城市一次即可。他不必在同一个城市开始和结束。这位旅行推销员注意到,他的同行们在规划和寻找最优路线时花费了太多时间。因此,他决定采取一种不同的、更系统的方法来规划他的路线。
他首先将所有城市分为左半部分和右半部分。如果城市数量为奇数,则右半部分比左半部分多一个城市。然后,他会选择其中一个半部分,并在访问另一个半部分的任何城市之前,先访问该半部分中的所有城市。
为了访问所选左/右半部分中的城市,他会将这组城市分为下半部分和上半部分。如果该集合中的城市数量为奇数,则上半部分将包含一个额外的城市。同样,他会先访问这些半部分中的一个,然后再访问另一个半部分中的任何城市。
他将继续应用这种交替进行水平和垂直平分城市的逻辑,直到获得完整的行程路径。计算推销员通过这种方式可以获得的最短路径。
输入格式
第一行包含推销员想要访问的城市数量 $N$。接下来的 $N$ 行给出了这些城市的位置。每个城市的位置由一对空格分隔的整数坐标 $X_i$ 和 $Y_i$ 定义,它们描述了其在平面上的位置。保证所有城市的 $X_i$ 坐标各不相同。$Y_i$ 坐标也同样各不相同。
数据范围
- $1 \le N \le 1000$
- $0 \le X_i, Y_i \le 10^6$
输出格式
在第一行,打印推销员路径的最小长度。如果该长度与官方解的误差不超过 $10^{-4}$,则视为正确。在第二行,输出一个空格分隔的城市列表,表示推销员访问城市的顺序。城市按照输入中给出的顺序从 $1$ 到 $N$ 编号。如果存在多种方案,你可以输出其中任意一种。
样例
输入 1
6 5 1 9 6 2 5 3 3 10 4 7 2
输出 1
13.142182 3 4 1 6 5 2
说明 1
推销员首先访问左半部分(城市 1、3 和 4),然后访问右半部分(城市 2、5 和 6)。
为了访问城市 1、3 和 4,他先访问上半部分(城市 3 和 4),然后再访问下半部分(城市 1)。上半部分中的城市被分为左半部分(城市 3,先访问)和右半部分(城市 4,后访问)。
城市 2、5 和 6 被分为下半部分(城市 6)和上半部分(城市 2 和 5)。在这里,推销员先访问下半部分。他继续前往上半部分,在那里他先访问右半部分(城市 5),最后访问左半部分(城市 2)。