atcoder#ABC286H. [ABC286Ex] Don’t Swim

[ABC286Ex] Don’t Swim

题目描述

二次元平面上に N N 頂点の凸多角形 C C 、点 S=(sx, sy), T=(tx,ty) S=(s_x,\ s_y),\ T=(t_x,t_y) があります。 C C の頂点は、反時計回りに (x1,y1),(x2,y2),,(xN,yN) (x_1,y_1),(x_2,y_2),\ldots,(x_N,y_N) です。 S,T S,T C C の外部にあることが保証されています。

C C の外周を除いた内部を通らずに点 S S から点 T T まで移動するときの最短距離を求めてください。

输入格式

入力は以下の形式で標準入力から与えられる。

N N x1 x_1 y1 y_1 x2 x_2 y2 y_2 \vdots xN x_N yN y_N sx s_x sy s_y tx t_x ty t_y

输出格式

答えを出力せよ。

なお、真の値との絶対誤差または相対誤差が 106 10^{-6} 以下であれば正解として扱われる。

题目大意

在二维平面上,有一个 NN 个顶点的凸多边形 CC,和两个点 S=(sx,sy),T=(tx,ty)S=(s_x,s_y),T=(t_x,t_y)CC 的顶点按顺时针方向依次是 (x1,y1),(x2,y2),,(xN,yN)(x_1,y_1),(x_2,y_2),\dots,(x_N,y_N)SSTT 在多边形 CC 的外面。

求出从 SSTT 的不进入 CC 内部(可以与其相切)的最短路的长度。

4
1 1
3 1
3 3
1 3
0 2
5 2
5.65028153987288474496
3
0 0
2 0
1 10
3 7
10 3
8.06225774829854965279

提示

制約

  • 3 N  105 3\leq\ N\ \leq\ 10^5
  • xi,yi,sx,sy,tx,ty 109 |x_i|,|y_i|,|s_x|,|s_y|,|t_x|,|t_y|\leq\ 10^9
  • (x1,y1),(x2,y2),,(xN,yN) (x_1,y_1),(x_2,y_2),\ldots,(x_N,y_N) は反時計回りに凸多角形をなす
  • C C のどの 3 3 点も同一直線上にない
  • S,T S,T C C の外部に存在し、C C の外周上にない
  • 入力は全て整数

Sample Explanation 1

最短距離を達成する移動方法の一例を以下の図で示します。 ![image](https://img.atcoder.jp/abc286/4affd3de612079930dd393002bbae832.png) (0,2)  (1,3) (3,3)(5,2) (0,2)\ \to\ (1,3)\ \to(3,3)\to(5,2) と移動すると、点 S S から点 T T への移動距離が 5.650281... 5.650281... となり、これが最小であることが証明できます。 C C の外周上は通れることに注意してください。 なお、絶対誤差または相対誤差が 106 10^{-6} 以下であれば正解として扱われるので、5.650287 などと出力しても正解と判定されます。