Общий квартал: площадь пересечения двух прямоугольников
Условие
В городе на карте отмечены два прямоугольных квартала (границы строго параллельны осям X и Y). Архитектору нужно понять, какая площадь попадает сразу в оба квартала — это и будет «общая зона».
Каждый квартал задан координатами двух противоположных углов: левого нижнего и правого верхнего.
Важно: координаты и промежуточные вычисления могут не помещаться в 32-битный тип (как на ВсОШ), используйте 64-битные целые. В Python это не проблема.
Формат ввода
Две строки.
В первой строке: x1 y1 x2 y2 — координаты левого нижнего и правого верхнего углов первого прямоугольника.
Во второй строке: x3 y3 x4 y4 — то же для второго прямоугольника.
Формат вывода
Выведите одно целое число — площадь пересечения двух прямоугольников.
Ограничения
- Все координаты — целые числа и лежат в диапазоне от
-100000до100000. - Для каждого прямоугольника гарантируется:
x1 < x2иy1 < y2(и аналогично для второго). - Площадь нужно вывести как целое число.
Пример
Ввод:
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).
План решения:
- Считайте
x1 y1 x2 y2иx3 y3 x4 y4. - Найдите координаты «общего» прямоугольника:
ix1 = max(x1, x3),ix2 = min(x2, x4)iy1 = max(y1, y3),iy2 = min(y2, y4)- Посчитайте ширину и высоту:
w = ix2 - ix1,h = iy2 - iy1. - Если
w <= 0илиh <= 0, пересечения нет (они разошлись или касаются только линией/точкой) — выведите 0. - Иначе выведите
w * h.
Сложность: O(1) по времени и O(1) по памяти.
Частая ошибка: использовать условие w < 0 вместо w <= 0. При касании границ площадь должна быть 0, а не отрицательное число или “нулевая” площадь, посчитанная неправильно.
Разберись руками
Есть два прямоугольника на координатной плоскости: первый от (0,0) до (4,3), второй от (2,1) до (6,5). Нужно понять, какая площадь попадает сразу в оба — то есть площадь их пересечения.
- Представь сетку из единичных квадратов: по X от 0 до 6 (6 столбцов), по Y от 0 до 5 (5 строк). Отметь ВСЕ клетки (единичные квадраты), которые лежат в пересечении двух прямоугольников: [0,4]×[0,3] и [2,6]×[1,5].
- Теперь найди «ширину» пересечения по X: возьми более правую из левых границ (0 и 2), и более левую из правых границ (4 и 6). Сколько получится по X?
- А теперь «высота» пересечения по Y: сравни нижние границы (0 и 1) и верхние (3 и 5). Какая высота у общей части?
- Площадь общей зоны — это сколько единичных клеток в этом прямоугольнике пересечения. Перемножь найденные ширину и высоту. Какая площадь?
Идея: Найди общую часть отдельно по X и отдельно по Y: где она начинается и где заканчивается. Если по какой-то оси общей части нет (получилась «неположительная» ширина или высота), то площадь 0. Иначе перемножь ширину и высоту общей части.
Решить задачу с автопроверкой на Python →
Куда дальше
- Школьный этап ВсОШ по информатике — как устроен первый этап и план подготовки за четыре недели
- Вердикты судьи: WA, TLE, RE, PE, CE — что значит каждый код проверяющей системы и где искать причину
- С нуля до олимпиады: маршрут — сколько занимает язык, какие приёмы нужны и к какому этапу это ведёт