#P16086. [Oni2018]Poligon

[Oni2018]Poligon

题目描述

给定一个有 NN 条边的凸多边形。接下来要执行 N1N-1 次移动。

一次移动选择当前多边形上相邻的两个点 A,BA,B,并把点 AA 移动到点 BB。这次移动的代价等于 A,BA,B 间的欧氏距离。移动后,点 AA 被点 BB 吸收,当前多边形点数减少 1。过程重复,直到多边形被压缩为一个点。

下图展示了一次把 AA 移动到 BB 的操作:

要求求出把多边形压缩为一个点的最小总代价,并在需要时输出一种达到最小总代价的移动序列。

任务

给定 TT 个凸多边形,根据输入中的任务编号 pp

  1. p=1p=1,输出每个多边形的最小总代价;
  2. p=2p=2,输出每个多边形的一种最优移动序列。

输入格式

第一行一个整数 pp,表示要解决的任务编号。

第二行一个整数 TT,表示多边形数量。

接下来依次给出 TT 个测试。每个测试格式如下:

第一行一个整数 NN,表示多边形边数。

接下来 NN 行,每行两个整数 x,yx,y,表示一个顶点坐标。顶点按逆时针顺序给出。

输出格式

根据 pp 的值输出:

  • p=1p=1:对每个测试输出一行实数 ans,表示最小总代价;
  • p=2p=2:对每个测试输出 N1N-1 行,每行两个整数 A,BA,B,表示一次移动:将顶点 AA 移动到顶点 BB

若在某次移动 A B 后顶点 AABB 吸收,那么之后再出现以 AA 为端点的移动均视为非法。

数据范围与限制

  • 1T51\le T\le 5
  • 1N20001\le N\le 2000
  • 对所有顶点,106x,y106-10^6\le x,y\le 10^6
  • 不存在两个顶点坐标完全相同
  • 多边形不一定严格凸,即可以存在连续共线顶点
  • p=1p=1,答案与标准答案误差不超过 10610^{-6} 即认为正确

子任务:

  • 5 分:N7N\le 7
  • 10 分:N15N\le 15
  • 15 分:N50N\le 50
  • 15 分:N100N\le 100
  • 15 分:N500N\le 500
  • 40 分:N2000N\le 2000

对于每个测试点,解决任务 1 可获得对应分数的 80%,解决任务 2 可获得对应分数的 20%。

样例 1

输入

1
2
4
0 0
1 0
1 1
0 1
5
0 0
8 0
8 10
4 20
0 10

输出

3
36.770329614269

样例 2

输入

2
2
4
0 0
1 0
1 1
0 1
5
0 0
8 0
8 10
4 20
0 10

一种输出

3 2
4 1
2 1
4 3
5 3
3 2
2 1