-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathP10245.cpp
65 lines (59 loc) · 1.53 KB
/
P10245.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <vector>
#define X first
#define Y second
typedef std::pair<double,double> Point;
typedef std::vector<Point> Vector;
#define INF 1e12
#define MIN(a,b) ((a)<(b)?(a):(b))
double distSq(const Point &p1, const Point &p2) {
return (p1.X-p2.X)*(p1.X-p2.X)+(p1.Y-p2.Y)*(p1.Y-p2.Y);
}
double closestPairDistSq(Point const * const pts, int N) {
if(N <= 1)
return INF;
if(N == 2)
return distSq(pts[0], pts[1]);
int midIndex = N/2;
double left = closestPairDistSq(pts, midIndex+1);
double right = closestPairDistSq(&pts[midIndex], N-midIndex);
double min = MIN(left,right);
Vector vLeft, vRight;
double midX = pts[midIndex].X;
for(int i = 0; i < midIndex; ++i) {
if((midX-pts[i].X)*(midX-pts[i].X) <= min)
vLeft.push_back(pts[i]);
}
for(int i = midIndex; i < N; ++i) {
if((-midX+pts[i].X)*(-midX+pts[i].X) <= min)
vRight.push_back(pts[i]);
}
for(unsigned int i = 0; i < vLeft.size(); ++i) {
for(unsigned int j = 0; j < vRight.size(); ++j) {
min = MIN(min, distSq(vLeft[i], vRight[j]));
}
}
return min;
}
int main() {
int N;
while(true) {
std::cin >> N;
if(N == 0)
return 0;
Point *pts = new Point[N];
for(int i = 0; i < N; ++i) {
std::cin >> pts[i].X >> pts[i].second;
}
std::sort(pts, pts+N);
double minDist = sqrt(closestPairDistSq(pts, N));
if(minDist >= 10000-1e-5)
printf("INFINITY\n");
else
printf("%.4lf\n", minDist);
delete[] pts;
}
}