1
+ #include < bits/stdc++.h>
2
+ #define ll long long
3
+ using namespace std ;
4
+
5
+ struct point {
6
+ ll x;
7
+ ll y;
8
+ };
9
+
10
+ bool compX (point a, point b) {
11
+ return a.x < b.x ;
12
+ }
13
+
14
+ bool compY (point a, point b) {
15
+ if (a.y < b.y )
16
+ return true ;
17
+ if (a.y > b.y )
18
+ return false ;
19
+ return a.x < b.x ;
20
+ }
21
+
22
+ point result1, result2;
23
+ double minDist = DBL_MAX;
24
+
25
+ double euclideanDistance (point a, point b) {
26
+ return sqrt (pow (a.x - b.x , 2 ) + pow (a.y - b.y , 2 ));
27
+ }
28
+
29
+ double bruteMin (vector<point> &pointsByX, ll low, ll high) {
30
+ ll i,j;
31
+ double dist,bestDistance = DBL_MAX;
32
+ for (i=low; i<=high; i++) {
33
+ for (j=i+1 ; j<=high; j++) {
34
+ dist = euclideanDistance (pointsByX[i], pointsByX[j]);
35
+ if (dist < bestDistance) {
36
+ bestDistance = dist;
37
+ if (bestDistance < minDist) {
38
+ minDist = bestDistance;
39
+ result1 = pointsByX[i];
40
+ result2 = pointsByX[j];
41
+ }
42
+ }
43
+ }
44
+ }
45
+ return bestDistance;
46
+ }
47
+
48
+ double closestPair (vector<point> &pointsByX, vector<point> &pointsByY, ll low, ll high) {
49
+ ll i,j,n = high - low + 1 ;
50
+ if (n <= 3 ) {
51
+ return bruteMin (pointsByX, low, high);
52
+ }
53
+
54
+ ll mid = low + (high - low)/2 ;
55
+
56
+ double distLeft = closestPair (pointsByX, pointsByY, low, mid);
57
+ double distRight = closestPair (pointsByX, pointsByY, mid+1 , high);
58
+
59
+ double bestDistance = min (distLeft, distRight);
60
+
61
+ vector<point> pointsInStrip;
62
+ for (i=0 ; i<n && abs (pointsByY[i].x - pointsByX[mid].x ) < bestDistance; i++) {
63
+ pointsInStrip.push_back (pointsByY[i]);
64
+ }
65
+
66
+ for (i=0 ; i<pointsInStrip.size (); i++) {
67
+ for (j=i+1 ; j<pointsInStrip.size () && abs (pointsInStrip[i].y - pointsInStrip[j].y ) < bestDistance; j++) {
68
+ double dist = euclideanDistance (pointsInStrip[i], pointsInStrip[j]);
69
+ if (dist < bestDistance) {
70
+ bestDistance = dist;
71
+ result1 = pointsInStrip[i];
72
+ result2 = pointsInStrip[j];
73
+ }
74
+ }
75
+ }
76
+
77
+ return bestDistance;
78
+ }
79
+
80
+ int main () {
81
+ ll i,n;
82
+ cin>>n;
83
+ vector<point> pointsByX (n), pointsByY (n);
84
+ for (i=0 ; i<n; i++) {
85
+ cin>>pointsByX[i].x >>pointsByX[i].y ;
86
+ pointsByY[i].x = pointsByX[i].x ;
87
+ pointsByY[i].y = pointsByX[i].y ;
88
+ }
89
+ sort (pointsByX.begin (), pointsByX.end (), compX);
90
+ sort (pointsByY.begin (), pointsByY.end (), compY);
91
+
92
+ cout<<" Shortest distance = " <<closestPair (pointsByX, pointsByY, 0 , n-1 )<<endl;
93
+ cout<<" Points are (" <<result1.x <<" ," <<result1.y <<" ) and (" <<result2.x <<" ," <<result2.y <<" )\n " ;
94
+ return 0 ;
95
+ }
0 commit comments