максимальное расстояние

Условие задачи

Условие

Даны точек . Пусть расстояние между двумя точками и равно .

Найдите максимальное расстояние, между двумя различными точками.

Решение

Решение

Отсортируем точки по возрастанию .

Сделаем бинпоиск по ответу ().

  • Попробуем сделать проверку за .

Пусть текущий индекс в массиве. Пусть .

Значит раскрывая модуль получаем . С помощью двух указателей будем передвигать , чтобы у всех точек до -ой как минимум первое условие выполнялось.

Тогда условие стало ещё проще Просто раскрыв модуль, получаем, что надо просто хранить самую верхнюю точку по и самую нижнюю по .

const int INF = INT_MAX;
int n;
vector<pair<int, int>> xy;

bool check(int k) {
  int j = 0;
  int mxy = -INF;
  int mny = INF;
  for (int i = 0; i < n; i++) {
    while (j < n && xy[j].first <= xy[i].first - k) {
      mxy = max(mxy, xy[j].second);
      mny = min(mny, xy[j].second);
      j++;
    }
    if (mny != INF && xy[i].second - mny >= k) return true;
    if (mxy != -INF && mxy - xy[i].second >= k) return true;
  }
  return false;
}

void solve() {
  cin >> n;
  xy.assign(n, {0, 0});
  for (int i = 0; i < n; i++) cin >> xy[i].first >> xy[i].second;
  sort(xy.begin(), xy.end());
  int l = 0, r = 2e9 + 7;
  while (r - l > 1) {
    int mid = (l + r) >> 1;
    if (check(mid)) {
      l = mid;
    } else {
      r = mid;
    }
  }
  cout << l;
}