Общий квартал: площадь пересечения двух прямоугольников

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

Условие

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

Каждый квартал задан координатами двух противоположных углов: левого нижнего и правого верхнего.

Важно: координаты и промежуточные вычисления могут не помещаться в 32-битный тип (как на ВсОШ), используйте 64-битные целые. В Python это не проблема.

Формат ввода

Две строки.

В первой строке: x1 y1 x2 y2 — координаты левого нижнего и правого верхнего углов первого прямоугольника.

Во второй строке: x3 y3 x4 y4 — то же для второго прямоугольника.

Формат вывода

Выведите одно целое число — площадь пересечения двух прямоугольников.

Ограничения

Пример

Ввод:

0 0 4 3
2 1 6 5

Вывод:

4

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

Приём: Пересечение отрезков по осям

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

Почему это работает: по оси X каждый прямоугольник занимает отрезок [x_left, x_right]. Общая часть — это отрезок с началом в max(x_left1, x_left2) и концом в min(x_right1, x_right2). То же самое по Y. Площадь пересечения равна (длина по X) * (длина по Y).

План решения:

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

Частая ошибка: использовать условие w < 0 вместо w <= 0. При касании границ площадь должна быть 0, а не отрицательное число или “нулевая” площадь, посчитанная неправильно.

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

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

Идея: Найди общую часть отдельно по X и отдельно по Y: где она начинается и где заканчивается. Если по какой-то оси общей части нет (получилась «неположительная» ширина или высота), то площадь 0. Иначе перемножь ширину и высоту общей части.

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

Куда дальше