Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define int long long
- #define OO 0x3f3f3f3f3f3f3f3f
- #define point pair<double, double>
- #define X first
- #define Y second
- double mindist;
- void upd_ans(const point & a, const point & b) {
- double dist = sqrt((a.X - b.X) * (a.X - b.X) + (a.Y - b.Y) * (a.Y - b.Y));
- if(dist < mindist) mindist = dist;
- }
- void closest_points(vector<point> &p) {
- int n = p.size();
- if(n <= 3) {
- for(int i = 0; i < n; i++)
- for(int j = i + 1; j < n; j++)
- upd_ans(p[i], p[j]);
- sort(p.begin(), p.end(),
- [](point p1, point p2) {
- return p1.Y < p2.Y;
- }
- );
- return;
- }
- int mid = n / 2;
- point m = p[mid];
- vector<point> a, b;
- for(int i = 0; i < mid; i++) a.push_back(p[i]);
- for(int i = mid; i < n; i++) b.push_back(p[i]);
- closest_points(a);
- closest_points(b);
- int l = 0, r = 0;
- a.push_back({OO, OO});
- b.push_back({OO, OO});
- vector<point> aux;
- for(int i = 0; i < n; i++) {
- if(a[l].Y < b[r].Y)
- p[i] = a[l++];
- else
- p[i] = b[r++];
- if(abs(m.X - p[i].X) < mindist)
- aux.push_back(p[i]);
- }
- a.pop_back();
- b.pop_back();
- n = aux.size();
- for(int i = 0; i < n; ++i)
- for(int j = i + 1; j < n and (aux[j].Y - aux[i].Y) < mindist; j++)
- upd_ans(aux[i], aux[j]);
- }
- int32_t main()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- int n;
- while(cin >> n and n) {
- vector<point> arr;
- for(int i = 0; i < n; i++) {
- double x, y;
- cin >> x >> y;
- arr.push_back({x, y});
- }
- sort(arr.begin(), arr.end(),
- [](point a, point b) {
- return a.X < b.X;
- }
- );
- mindist = OO;
- closest_points(arr);
- if(mindist >= 10000) cout << "INFINITY\n";
- else cout << fixed << setprecision(4) << mindist << '\n';
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement