Квадрат дистанции между кварталами
Условие
В городе координатная сетка: каждый квартал имеет целые координаты (x, y). Навигатор для быстрых прикидок не считает корень, а сравнивает маршруты по квадрату расстояния по прямой.
Найдите квадрат евклидова расстояния между двумя кварталами A и B.
Важно: результат может не помещаться в 32-битный тип (как на ВсОШ), используйте 64-битные целые. В Python это не проблема.
Формат ввода
Одна строка: четыре целых числа x1 y1 x2 y2 — координаты кварталов A(x1, y1) и B(x2, y2).
Формат вывода
Выведите одно целое число — квадрат расстояния между A и B.
Ограничения
-100000 ≤ x1, y1, x2, y2 ≤ 100000
Пример
Ввод:
0 0 3 4
Вывод:
25Как решать — идея подхода
Приём: Формула расстояния без корня
Ключевое наблюдение: навигатор сравнивает не само расстояние, а его квадрат, поэтому корень считать не нужно. Квадрат евклидова расстояния между точками A(x1, y1) и B(x2, y2) равен сумме квадратов разностей по осям.
Почему это работает: по теореме Пифагора длина гипотенузы в прямоугольном треугольнике с катетами dx и dy равна sqrt(dx*dx + dy*dy). Если нам нужен квадрат длины, корень «убирается» сразу.
План решения:
- Считать
x1 y1 x2 y2. - Посчитать смещения:
dx = x1 - x2,dy = y1 - y2. - Ответ:
dx*dx + dy*dy. - Вывести это число.
Мини-сниппет с формулой:
dx = x1 - x2dy = y1 - y2ans = dx*dx + dy*dy
Сложность: O(1) по времени и O(1) по памяти.
Частая ошибка: пытаться считать обычное расстояние через корень и потом возводить обратно в квадрат (можно получить вещественные числа и ошибки округления). Здесь нужны только целые операции.
Разберись руками
Квартал A находится в точке (0, 0), а квартал B — в точке (3, 4). Навигатор сравнивает не само расстояние, а его квадрат, чтобы не считать корень.
- Отметь на сетке два квартала: A(0,0) и B(3,4). (Ось x — вправо, ось y — вверх.)
- Сколько кварталов разницы по x между A и B? (То есть насколько нужно сдвинуться вправо/влево от x=0 до x=3.)
- Сколько кварталов разницы по y между A и B? (От y=0 до y=4.)
- Теперь найди квадрат расстояния по прямой: возьми квадрат сдвига по x и квадрат сдвига по y и сложи. Сколько получится?
Идея: Сначала находишь, на сколько точки отличаются по x и по y (это два “катета” на сетке). Потом возводишь каждый из этих сдвигов в квадрат и складываешь — получаешь квадрат расстояния без корня.
Решить задачу с автопроверкой на Python →
Куда дальше
- С нуля до олимпиады: маршрут — сколько занимает язык, какие приёмы нужны и к какому этапу это ведёт
- Перечневые олимпиады: что это и что дают — весь перечень Минобрнауки: уровни, срок диплома, разрезы по предметам и классам
- Олимпиада по информатике: с чего начать — два мира олимпиад — ВсОШ и перечневые: этапы, задания и на каком языке писать