最も近い点は、1点でのポイントの最も近いペアを見つけるために集中することです。
例を見てください
問題は、私は最終的に上記の質問に対する解決の助けを借りて。
n個のエージェントと原子力発電所のnがある旨の件名は、原子力発電所の最近の任意の距離にエージェントを見つけます。
まず、私たちは点間の距離のグループが無限大であると、この問題は、問題の最も近い点に変換することができ、2つのグループに分け指します。
この問題を解決する方法についての最も近い点?
最初に考えたのは、N-ある2暴力、しかし間違いなく期限切れにします。
だから我々はそれを最適化するためのパーティションを必要としています。
まず、一般的に、二点横最近乏しいが小さい場合、我々は、横軸の分割統治することができます。
示されるように、最初は、(ちょうど割り当てられたピースの中央になど)2つの部分にすべてのポイントに、横軸のキーワードランキングを指します。
最短距離が最短距離と右のブロックの左ブロックからの最短距離が、当然のことながら、図のAbで、例えば、ブロックの点でも異なっていてもよいことは明らかです。
最初の二つはただのような分割統治を継続する必要があり、非常に簡単に達成することです。トラブルは三番目のケースです。
我々は最初の2つの従来ANS、横軸及び差の中間点の最小値のみにくい因子をANS決定しました。
だから我々はちょうど点間の最短距離を必要とします。
私たちが直接暴力を行うことができますこれらの点については、通常の状況下では素晴らしいことではないはずです。
距離がANS縦より大きい場合もちろん、それは最短距離です。
ソート(B + 1、B + CNT + 1、CMP2)。 担当者(I、1、CNT) 担当者(J、I + 1、CNT){ IF(B [j]・Y> = B [i]は.Y + ANS)ブレーク。 ANS =分(ANS、DIST(B [I]、B [J]))。 }
あなたは、縦軸は剪定、最初のキーワードでソートすることができます。
私は間違ったコードを数回入れ
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #include <cmath> 6 #include <vector> 7 #define rep(x, l, r) for(int x = l; x <= r; x++) 8 #define repd(x, r, l) for(int x = r; x >= l; x--) 9 #define clr(x, y) memset(x, y, sizeof(x)) 10 #define all(x) x.begin(), x.end() 11 #define pb push_back 12 #define mp make_pair 13 #define MAXN 200005 14 #define fi first 15 #define se second 16 #define SZ(x) ((int)x.size()) 17 using namespace std; 18 typedef long long ll; 19 typedef vector<int> vi; 20 typedef pair<int, int> pii; 21 const int INF = 1 << 30; 22 const int p = 1000000009; 23 int lowbit(int x){ return x & (-x);} 24 int fast_power(int a, int b){ int x; for(x = 1; b; b >>= 1){ if(b & 1) x = 1ll * x * a % p; a = 1ll * a * a % p;} return x % p;} 25 26 int n; 27 struct node{ 28 double x, y; 29 bool col; 30 }a[MAXN], b[MAXN]; 31 32 bool cmp1(node a, node b){ 33 if(a.x == b.x) return a.y < b.y; 34 return a.x < b.x; 35 } 36 37 bool cmp2(node a, node b){ 38 if(a.y == b.y) return a.x < b.x; 39 return a.y < b.y; 40 } 41 42 double dist(node a, node b){ 43 if(a.col == b.col) return INF; 44 return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); 45 } 46 47 double work(int l, int r){ 48 if(l == r) return INF; 49 if(l == r - 1) return dist(a[l], a[r]); 50 int mid = (l + r) >> 1; 51 double ans = min(work(l, mid), work(mid + 1, r)); 52 int cnt = 0; 53 rep(i, l, r) 54 if(a[i].x >= a[mid].x - ans && a[i].x <= a[mid].x + ans) b[++cnt] = a[i]; 55 sort(b + 1, b + cnt + 1, cmp2); 56 rep(i, 1, cnt) 57 rep(j, i + 1, cnt){ 58 if(b[j].y >= b[i].y + ans) break; 59 ans = min(ans, dist(b[i], b[j])); 60 } 61 return ans; 62 } 63 64 int main(){ 65 int t; 66 scanf("%d", &t); 67 while(t--){ 68 scanf("%d", &n); 69 rep(i, 1, n){ 70 scanf("%lf%lf", &a[i].x, &a[i].y); 71 a[i].col = 0; 72 } 73 rep(i, n + 1, 2 * n){ 74 scanf("%lf%lf", &a[i].x, &a[i].y); 75 a[i].col = 1; 76 } 77 n *= 2; 78 sort(a + 1, a + n + 1, cmp1); 79 double ans = work(1, n); 80 printf("%.3f\n", ans); 81 } 82 return 0; 83 }