HDU 1007二次元の最も近い点問題(分割統治)

三つの領域の最も近い点が発生することがあります。SL、SR、LをDが距離SLのSRに最も近い点である両側(LD〜のL + D)の 

 

 出典:https://www.cnblogs.com/AdaByron/archive/2011/10/07/2200966.html

次のコードを参照してhttps://blog.csdn.net/u011523796/article/details/41593511

1つの#include <アルゴリズム>
 2の#include <cstdioを>
 3の#include <cmath>
 4の#include <CStringの>
 5  使って 名前空間STDを、
6  
7  のconst  int型 N = 100005 8  
9のtypedef 構造体TagPoint {
 10      ダブルX、Y。
11      int型のインデックス。
12  }ポイント。
13  
14  ポイント[N]、B [N]、[N] C。
15  
16  ブール cmp_x(CONST A点、CONST B点){
 17     リターン斧< BX。
18  }
 19  
20  ブール cmp_y(CONST A点、CONST B点){
 21      リターン AY < によって、
22  }
 23の 
24  二重DIS(点P、点Q){
 25      ダブル X1 = PX - QX、Y1 = PY - QY。
26      リターン SQRT(×1 *×1 + Y1の*のY1)。
27  }
 28  
29  空隙マージ(点B []、点C []、INT L、INT M、INT R){//归并操作
 30      INTI =のL。
31      INT P1 = L、P2 = M + 1 32      一方(P1 <= M && P2 <= R){
 33件の          B [I ++] = Cの[P1] .Y <C [P2] .Y?C [P1 ++]:C [P2 ++ ];
34      }
 35      ながら(P1 <= M)B [I ++] = Cの[P1 ++ ]。
36      一方(P2 <= r)はB [I ++] = Cを[P2 ++ ]。
37件      のmemcpy(C + L、B + L、(R-L + 1)* はsizeof (ポイント))。
38  }
 39  
40  二重([]、点B []、点C []、ポイント最も近い整数の L、int型r)を{
 41     もし(R - Lの== 1を返すDIS([L]を、[R])。
42      であれば(R - L == 2 ){
 43          ダブル X1 = DIS([L]、[R])。
44          二重 X2 = DIS([L + 1 ]、[R])。
45          二重 X3 = DIS([L]、[L + 1 ])。
46          もし(X1 <X2 && X1 <X3)リターン×1。
47          他に あれば(X2 <X3)リターン×2。
48          他の リターン×3。
49      }
 50      INT半ば=(L + R)/2 ;
 51である     int型、J、K I;
 52である     ため(L = I、J = L、K + = MID 。1 ; I <= R&LT ++ {I)
 53が         IF(B [I] .INDEX <= MID)C 【Jは++] = B [I];
 54である          C [K ++] = B [I];
 55      }
 56が     ダブル D1 = 最寄り(、C、B、L、MID); //操作が「b値意志「C削減Bを通るようにライン60の変化;
 57は、     ダブル D2 =最寄り(A、C、B、MID + 。1 ;、R&LT)
 58      ダブル DM = 分(D1、D2);
 59      
60      マージ(B、C、L 、MID、R&LT)
 61がある     ため(I = L、Kが= L、Iは<= R&LT; ++I){
 62          であれば(ファブ(B [i]は.X - [中間] .X B)< DM){
 63個の              C [kは++] =のB [i]は、
64          }
 65      }
 66      のために(!I = 1; I = K; ++ I){
 67          のための(j = iは+ 1!; J = K && C [J] .Y - C [i]は.Y <DM。 ++ J){
 68              ダブル TEMP = DIS(C [I]、C [J])。
69              であれば(温度<DM)DM = TEMP。
70          }
 71      }
 72      リターンDM。
73  }
 74  
75  int型のmain(){
76      INT N-;
 77      ながら(scanfの(" %のD "、およびN-)== 1個の && N-){
 78          のためにint型 I = 0、= N-I ;! ++ I){
 79              scanfの(" %% LF LF "、&​​A [I] .X、&A [I] .Y);
 80          }
 81          ソート(A、A + N-、cmp_x);
 82          INT I = 0、I = N- ;! ++ I){
 83              A [ I] .INDEX = I; //点aを保存横後昇順に配列されている
 84          }
85          のmemcpy(B、A、はsizeof (A))、
 86          ソート(B、B + 昇順// B座標点メモリに配置された、N-、cmp_y)
 87          のprintf(" %.2lf \ N- "最も近い(A 、B、C、0、N- 1)/ 2 );
 88      }
 89      リターン 0 ;
 90 }

 

おすすめ

転載: www.cnblogs.com/pupil-xj/p/11567015.html