Advertisement
matheus_monteiro

Closest Pair of Points in 2D

Feb 7th, 2025
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.03 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define int long long
  5. #define OO 0x3f3f3f3f3f3f3f3f
  6.  
  7. #define point pair<double, double>
  8. #define X first
  9. #define Y second
  10.  
  11. double mindist;
  12.  
  13. void upd_ans(const point & a, const point & b) {
  14.     double dist = sqrt((a.X - b.X) * (a.X - b.X) + (a.Y - b.Y) * (a.Y - b.Y));
  15.     if(dist < mindist) mindist = dist;
  16. }
  17.  
  18. void closest_points(vector<point> &p) {
  19.    int n = p.size();
  20.  
  21.    if(n <= 3) {
  22.       for(int i = 0; i < n; i++)
  23.          for(int j = i + 1; j < n; j++)
  24.             upd_ans(p[i], p[j]);
  25.      
  26.       sort(p.begin(), p.end(),
  27.          [](point p1, point p2) {
  28.             return p1.Y < p2.Y;
  29.          }
  30.       );
  31.  
  32.       return;
  33.    }
  34.  
  35.    int mid = n / 2;
  36.    point m = p[mid];
  37.    vector<point> a, b;
  38.    for(int i = 0; i < mid; i++) a.push_back(p[i]);
  39.    for(int i = mid; i < n; i++) b.push_back(p[i]);
  40.  
  41.    closest_points(a);
  42.    closest_points(b);
  43.  
  44.    int l = 0, r = 0;
  45.    a.push_back({OO, OO});
  46.    b.push_back({OO, OO});
  47.  
  48.    vector<point> aux;
  49.  
  50.    for(int i = 0; i < n; i++) {
  51.       if(a[l].Y < b[r].Y)
  52.          p[i] = a[l++];
  53.       else
  54.          p[i] = b[r++];
  55.  
  56.       if(abs(m.X - p[i].X) < mindist)
  57.          aux.push_back(p[i]);
  58.    }
  59.  
  60.    a.pop_back();
  61.    b.pop_back();
  62.  
  63.    n = aux.size();
  64.    for(int i = 0; i < n; ++i)
  65.       for(int j = i + 1; j < n and (aux[j].Y - aux[i].Y) < mindist; j++)
  66.          upd_ans(aux[i], aux[j]);
  67. }
  68.  
  69. int32_t main()
  70. {
  71.     ios_base::sync_with_stdio(false);
  72.     cin.tie(nullptr);
  73.    
  74.     int n;
  75.     while(cin >> n and n) {
  76.         vector<point> arr;
  77.         for(int i = 0; i < n; i++) {
  78.             double x, y;
  79.             cin >> x >> y;
  80.             arr.push_back({x, y});
  81.         }
  82.         sort(arr.begin(), arr.end(),
  83.             [](point a, point b) {
  84.                 return a.X < b.X;
  85.             }
  86.         );
  87.        
  88.         mindist = OO;
  89.         closest_points(arr);
  90.         if(mindist >= 10000) cout << "INFINITY\n";
  91.         else cout << fixed << setprecision(4) << mindist << '\n';
  92.     }
  93.  
  94.     return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement