Ctrl K

Контур городской застройки

Сложная
Если смотреть на город издалека, дома сливаются в один силуэт. Каждый дом — прямоугольник, стоящий на ровной земле: buildings[i] = [left, right, height], где left и right — координаты левой и правой стен, а height — высота. Дома перечислены по неубыванию left. Опишите верхний контур силуэта списком точек [x, y] по возрастанию x. Каждая точка отмечает место, где высота контура меняется: начиная с x и до следующей точки контур идёт на высоте y. Земля между домами тоже часть контура (высота 0). Последняя точка всегда имеет высоту 0 и стоит там, где кончается самый правый дом. У двух соседних точек высоты должны различаться: если контур на нескольких участках подряд идёт на одной высоте, это один участок и одна точка.
Пример 1
buildings=[[1, 4, 6], [2, 7, 3], [9, 11, 5]] → [[1, 6], [4, 3], [7, 0], [9, 5], [11, 0]]

От 1 до 4 контур идёт по высоте 6, дальше до 7 виден только второй дом высотой 3, от 7 до 9 — земля, затем третий дом высотой 5 до 11.

Пример 2
buildings=[[0, 3, 2], [3, 6, 2]] → [[0, 2], [6, 0]]

Два дома одной высоты стоят вплотную, поэтому контур — один горизонтальный отрезок от 0 до 6, и точки на 3 нет.

Пример 3
buildings=[[2, 8, 4], [3, 5, 9]] → [[2, 4], [3, 9], [5, 4], [8, 0]]

Высокий дом стоит на фоне низкого: контур поднимается с 4 до 9 на отрезке от 3 до 5 и возвращается к 4.

Ограничения
  • 1 ≤ len(buildings) ≤ 10⁴
  • 0 ≤ left < right ≤ 2³¹ − 1
  • 1 ≤ height ≤ 2³¹ − 1
  • buildings упорядочен по неубыванию left
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиМеньшие справа СложнаяСуммы отрезков в заданной полосе СложнаяПары с крутым спадом СложнаяТёмный промежуток между фонарями СложнаяЦена расстановки на полке Сложная
загружаем Python…
Вход
buildings=[[1, 4, 6], [2, 7, 3], [9, 11, 5]]
Ожидается
[[1, 6], [4, 3], [7, 0], [9, 5], [11, 0]]

«Запустить» — первые 3 теста у тебя в браузере, «Отправить» — все 85 тестов на сервере, включая скрытые.