모든 가능성이 가장 높은 우선 폭력 N2가 최소를 찾을 수있는 모든 세그먼트의 열거 생각합니다,하지만 낭비 많은 노력을 할 것입니다. 먼저, 광고를 선별 할 수있는 X 축, Y 축 세그먼트 순서에 따라 가장 왼쪽 끝에, 우리는 각 u, i 번째 세그먼트에 대해 단지 최소의 값을 가질 수있다 직사각형 프레임의 세그먼트 내의 모든 세그먼트를 정의 할 수 있도록 세그먼트의 i 번째의 최 우측 지점의 j 번째 세그먼트의 차가 X X 가장 왼쪽 지점 ANS보다 큰 경우, 가장 가까운 거리, 그것은 직접 열거 의미없는 후보다 커야 깰 수 ANS 때문에 정이 복잡성이 부분의 첨가는 큰 부분을 압축한다.
1 // --By DD_BOND 2 3 // #INCLUDE <비트 / stdc ++. H> 4 // #INCLUDE <unordered_map도> 5 // #INCLUDE <unordered_set> 6 #INCLUDE <작용> 7 #INCLUDE <알고리즘> 8 # 포함 <iostream> 9 // #INCLUDE <EXT / 로프> 10 #INCLUDE <iomanip> 11 #INCLUDE <climits> 12 #INCLUDE <CString을> 13 #INCLUDE <cstdlib> 14 #INCLUDE <cstddef> 15 #INCLUDE <cstdio> 16 #INCLUDE < 메모리> 17#INCLUDE <벡터> 18 #INCLUDE <cctype> 19 #INCLUDE < 문자열 > 20 #INCLUDE <cmath> 21 #INCLUDE <큐> 22 #INCLUDE <양단> 23 #INCLUDE <ctime이> 24 #INCLUDE <적층> 25 #INCLUDE <지도> 26 #INCLUDE < 설정 > 27 28 #DEFINE 인터넷 제 29 #DEFINE SE 제 30 #DEFINE MP make_pair 31 #DEFINE의 납와 push_back 32 33 의 #pragma GCC의 최적화 (3) 34 의 #pragma GCC 타겟 ( "SSE, SSE2, SSE3, SSSE3, SSE4, popcnt, ABM, MMX, AVX 튜닝 = 네이티브") 35 36 사용 스페이스 성병; 37 38 타입 정의 긴 긴 LL; 39 40 CONST의 INT MAXN 1E5 + = 10 ; 41 CONST 두 EPS 1e- = 8 ; 42 CONST 이중 PI ACOS = (- 1.0 ); 43 CONST LL = INF 0x3f3f3f3f3f3f3f3f ; 44 45 인라인 INT의 DCMP ( 두 배) { 46 의 경우 (팹 (X) <EPS) 복귀 0 ; 47 창 (x> 0 ? 1 - 1 ); 48 } 49 50 인라인 이중 SQR ( 두 배) { 반환 X * X; } 51 52 구조체 포인트 { 53 번 X, Y; INT의 ID; 54 점 () {X = 0 , Y는 = 0 ; } 55 포인트 ( 더블 _x, 이중 _y) : X (_x), Y (_y) {} (56) 무효 입력 () {는 scanf ( " %의 LF의 %의 LF " , X, Y); } 57 무효 출력 () {의 printf ( " % .2f % .2f \ n " , X, Y); } 58 인라인 부울 연산자 <( CONST 요점 b) CONST { 59 창 (DCMP (xb.x) == 0 ? DCMP (yb.y) < 0 : X < BX); 60 } 61 인라인 소수점 연산자 - ( CONST 요점 b) CONST { 62 반환포인트 (Y- xb.x 의해) 63이다 } 64 인라인 더블 LEN2 () { // 길이 정사각형 65 리턴 SQR (X) + SQR (Y) (66) } (67) 인라인 더블 LEN () { // 길이 68 반환 SQRT (LEN2 ()); (69) } (70) } (71)는 72 인라인 더블 {크로스 (점 A, 점 B) // 외적 (73)가 복귀 하여 AX-AY * ; BX 74 } 75 76 인라인더블 DOT (점 A, 점 B) { // 내적 77 리턴 AX + AY * b.x 단계; 78 } 79 80 인라인 더블 DIS (점 A, 점 B) { // 두 점 사이의 거리를 81 포인트 P BA =; 리턴 p.len (); 82 } 83 84 구조체 선 { 85 포인트 S, E, 86 라인 () {} 87 라인 (포인트 _s, _E 점) : S (_s), E (_E) {} // 두 지점은 라인을 정의하는 88 무효 입력 () { 89 s.input () 90 e.input (); 91이다 } 92 번 길이 () { 93 창 , DIS (S, E) 94 } 95 } 96 97 인라인 더블 point_to_line (포인트 P, 선 A) { // 직선 가리킨 거리 98 리턴 FABS (크로스 (Pa.s이며, AE-AS) / a.length ()); 99 } 100 101 인라인 더블 point_to_seg (포인트 P, 선 A) { // 선분 포인트 102 IF (DCMP (도트 (Pa.s이며 , AE-AS)) < 0 || DCMP (DOT (pa.e, AS-AE)) < 0 ) 103 리턴 분 (DIS (p로서는, AE), DIS (p 등)); 104 복귀 point_to_line (p, a); 105 } 106 107 인라인 이중 seg_to_seg (선 U, 선 V) { 108 리턴 분 (분 (point_to_seg (미국, V) point_to_seg (UE, V)), 분 (point_to_seg ()는 U, 대, point_to_seg는 (U를했습니다 ))); 109 } 110 111 선 라인 [MAXN]; 112 113 부울 CMP (라인 A, 라인 B) { 114 창 <같은 기지국; 115 } 116 117 INT 본체 ( 무효 ) { 118 INT의 T; scanf와 (" %의 D ' , T); (119) 동안 (T-- ) { 120 INT N; scanf와 ( " %의 D ' , N); (121) 에 대한이 ( 값 int = 1을 0 ; i가 ++] i가 N < ) { 122 라인 [I] .input (); 123 의 경우 (라인 [I] 전화부 < 라인 [I] .S) 스왑 (라인 [I] .S 라인 [I] 전화부); 124 } 125 정렬 (광고, 광고 + N, CMP); 126 번 ANS = 1E10; 127 대 ( INT I = 0; 나는 N <; 내가 ++ ) (128) 에 대해 ( INT의 J = 나 + 1 , J <N; J ++ ) { 129 경우 (DCMP (라인 [J] .sx 라인 [I] .ex-ANS)> 0 ) 분해 ; 130 = ANS 분 (ANS, seg_to_seg (라인 [I], 라인 [J])); 131 } 132 의 printf ( " % .12f \ 없음 " , ANS); 133 } 134 복귀 0 ; 135 }