세그먼트 6697 HDU 가까운 쌍 (선분)

모든 가능성이 가장 높은 우선 폭력 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 }

추천

출처www.cnblogs.com/dd-bond/p/11391771.html