1550. 部道乐跑 II

jl 和 sz 总是一起在无故事王国完成部道乐跑的任务。在这学期他们每人都需要完成 30 次部道乐跑任务,每个任务需要跑 2500m,并且完成两个签到任务。完成一个签到任务当且仅当处于距离签到点小于等于 \mathbf{100m} 的位置

由于每次领取任务时,jl 和 sz 领取到的签到任务不都是一样的,而他们又想一起同行。于是,他们决定,从一个起始点出发,按照特定顺序一起完成他们加起来的四个签到任务。

由于他们不想深入思考,所以他们采用如下的简单方法跑步:选择一个尚未完成的签到点,从起始点出发走直线一直跑,直到跑到离该签到点恰为 100m 的位置。此时,他们会检查此刻尚未完成的其他签到点,并再次选择一个,从当前位置出发前往新的签到点,直到跑到离该签到点恰为 100m 的位置。如此循环,直到完成所有的签到任务。

他们想要知道,对于给定的起始点和四个签到点,是否存在一个顺序,使得他们能跑够 2500m?如果能,他们还想知道最少需要跑多远?

假设起始点和签到点均分布在平面直角坐标系上,并且都是整点(即横纵坐标均为整数)。假设两点之间的距离均取直线距离。规定输入输出中所有数值的单位为 m

特别注意:

  • 距离起始点小于等于 100m 的签到任务在开始跑步的瞬间就会完成签到任务。
  • 使用上述方法跑步时,从一个点前往另一个签到点外的路线上可能会顺便完成其他的签到任务。

提示:对于C/C++选手,在引用了头文件math.h/cmath时,可以使用sqrt()函数计算一个浮点数的平方根;对于Python选手,表达式a**0.5即可计算浮点数a的平方根。

输入

首先输入一行一个整数 t(1\le t\le10^3),代表询问的次数。

对于每个询问,接下来输入 5 行,每行两个整数 x_i,y_i(-10^4\le x,y\le10^4),依次代表起始点和四个签到点的坐标。

输出

对于每个询问,若不存在一个顺序使得他们能跑够 2500m,在一行内输出no;若存在一个顺序使得他们能跑够 2500m,在一行内输出最少需要跑的总路程(四舍五入取整数)。

样例

标准输入 复制文本
2
0 0
0 500
0 -500
500 0
-500 0
100 100
2712 100
800 60
1400 110
2333 123
标准输出 复制文本
2564
2512
标准输入 复制文本
1
0 0
50 50
50 50
-50 50
0 2499
标准输出 复制文本
no
标准输入 复制文本
4
0 0
0 500
0 1000
0 2000
0 2600
0 0
0 5
0 1000
0 2000
0 2500
0 0
300 0
-200 0
700 0
-858 58
0 0
300 0
-200 0
700 0
-800 0
标准输出 复制文本
2500
no
2519
2500

提示

对于样例1的询问1:

起始点是O(0,0),四个签到点分别是A(0,500),B(0,-500),C(500,0),D(-500,0)

如果先选择A,那么沿OA跑到A'(0,400)时,距离该签到点恰为100,此时完成该签到任务,且路途上没有别的签到任务被完成。从A'出发,若再选择B,则沿A'B跑到B'(0,-400)时,完成签到任务,路途上没有别的签到任务被完成。从B'出发,若再选择C,沿B'C跑到C'(421.913119,-62.469505)时,完成签到任务,路途上没有别的签到任务被完成。从C'出发,若再选择D,沿C'D跑到D'(-400.228788,-6.760570)时,完成签到任务,此时所有任务均被完成。总距离为OA'B'C'D'\approx2564.339604,这个选择是唯一大于2500的(其他所有选择只能得到的另两个路程分别为:2143,2310),故答案为2564

对于样例1的询问2

起始点是O(100,100),四个签到点分别是A(2712,100),B(800,60),C(1400,100),D(2333,123)

如果先选择A,沿OA跑到A'(2612,100)时,完成该签到任务,路上完成了剩余的所有签到任务。所以总路程为OA'=2512。如果选择其他方案,可以计算出答案均大于2512。本询问所有可能的距离均大于2500。故答案为2512

对于样例2:注意一开始瞬间完成了三个签到点,只剩下最后一个签到点(0,2499),故只有唯一一种方案,求得路程为2399<2500,故答案为no

来源

lr580

登录以提交代码。
单点时限 2 秒
内存限制 256 MB
提交 6
通过 3