Площадь перекрытия двух кварталов

тема: Геометрия (формулы) · уровень: средний

Условие

В городе на карте отмечают прямоугольные кварталы (границы идут строго по осям X и Y). Иногда два проекта кварталов накладываются друг на друга, и архитектору нужно знать площадь общей части.

Каждый квартал задан координатами двух противоположных углов. Углы могут быть перечислены в любом порядке.

Найдите площадь пересечения двух прямоугольников. Если общей части нет (или они только касаются границей/углом), площадь считается равной 0.

Важно: координаты могут быть до 10^9 по модулю, а площадь — до 10^18 (как на олимпиадах, это может не помещаться в 32-битный тип).

Формат ввода: Две строки. В первой строке: четыре целых числа x1 y1 x2 y2 — два противоположных угла первого прямоугольника. Во второй строке: четыре целых числа x3 y3 x4 y4 — два противоположных угла второго прямоугольника.

Формат вывода: Одно целое число — площадь пересечения.

Ограничения: -10^9 ≤ xi, yi ≤ 10^9.

Пример Ввод:

0 0 5 4
2 1 6 4

Вывод:

9

Как решать — идея подхода

Приём: Нормализация прямоугольника и пересечение по осям

Ключевое наблюдение: у осевых прямоугольников общая часть тоже прямоугольник, а значит её площадь можно найти как width * height, где width — длина пересечения проекций на ось X, а height — на ось Y.

Почему это работает: прямоугольник задаётся независимыми границами по X и Y. Если проекции на X не пересекаются — общей площади нет, то же для Y.

План:

Мини-сниппет формулы: w = min(r1, r2) - max(l1, l2) h = min(t1, t2) - max(b1, b2)

Сложность: O(1) по времени и памяти.

Частая ошибка: забыть про случай касания и проверять w < 0 вместо w <= 0 (тогда при нулевой ширине/высоте получится «площадь 0, но как будто пересечение есть»). Также не забывайте нормализовать углы — они могут идти в любом порядке.

Разберись руками

Есть два прямоугольных квартала на карте. Первый задан углами (0,0) и (5,4), второй — (2,1) и (6,4). Нужно найти площадь общей части, если смотреть на клетки 1×1.

Идея: Сначала отдельно находишь, какой общий кусок есть по X, потом — какой общий кусок есть по Y. Если хотя бы по одной оси общего куска нет, площадь 0. Если есть по обеим осям, то общая часть — прямоугольник, и его площадь получается из ширины и высоты пересечения.

Решить задачу с автопроверкой на Python →

Куда дальше