Advertisement
MathQ_

Untitled

Feb 22nd, 2021
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.31 KB | None | 0 0
  1. const pair<pt, pt> MIN{pt((ll)-1e9 - 1, (ll)-1e9 - 1), pt((ll)1e9 + 1, (ll)1e9 + 1)};
  2. vector<pt> pts;
  3. pair<pt, pt> rec(int l, int r) {
  4.     if (r - l <= 10) {
  5.         pair<pt, pt> _min = MIN;
  6.         for (int i = l; i < r; ++i) {
  7.             for (int j = i + 1; j < r; ++j) {
  8.                 _min = Min(_min, mp(pts[i], pts[j]));
  9.             }
  10.         }
  11.         return _min;
  12.     }
  13.     int m = (l + r) / 2;
  14.     pair<pt, pt> best1 = rec(l, m);
  15.     pair<pt, pt> best2 = rec(m, r);
  16.     pair<pt, pt> best = Min(best1, best2);
  17.  
  18.     int st = l, en = r - 1;
  19.     while (pts[m].x - pts[st].x > dist(best)) {
  20.         ++st;
  21.     }
  22.     while (pts[en].x - pts[m].x > dist(best)) {
  23.         --en;
  24.     }
  25.     vector<pt> left, right;
  26.     for (int i = st; i < m; ++i) left.push_back(pts[i]);
  27.     for (int i = m; i <= en; ++i) right.push_back(pts[i]);
  28.     sort(all(left), comp2);
  29.     sort(all(right), comp2);
  30.     int R = m;
  31.     for (int L = st; L < m; ++L) {
  32.         while (R <= en && pts[R].y - pts[L].y <= dist(best)) {
  33.             best = Min(best, mp(pts[L], pts[R]));
  34.             ++R;
  35.         }
  36.     }
  37.     return best;
  38. }
  39.  
  40. int main() {
  41.     int n;
  42.     cin >> n;
  43.     pts.resize(n);
  44.     cin >> pts;
  45.     sort(all(pts), comp1);
  46.     pair<pt, pt> ans = rec(0, n);
  47.     cout << ans.fi << '\n' << ans.se << '\n';
  48.     return 0;
  49. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement