Сколько аудиторий нужно кружкам

тема: Интервалы: покрытие и расписание · уровень: продвинутый

Условие

В школе в один день проходит много занятий кружков. Для каждого занятия известно время начала и время конца (в минутах от 0 до 1\u00a0000\u00a0000).

Если два занятия идут одновременно, им нужны разные аудитории. Если одно занятие заканчивается ровно в минуту X, а другое начинается ровно в минуту X, то они не пересекаются и могут пройти в одной аудитории.

Нужно понять, какое минимальное число аудиторий достаточно, чтобы провести все занятия.

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

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

Ограничения:

Пример: Ввод:

5
0 10
10 20
5 15
15 25
7 8

Вывод:

3

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

Приём: Сканирующая прямая (события начала/конца)

Ключевое наблюдение: нам не важно, какая аудитория кому досталась. Важно только, сколько занятий одновременно активны. Тогда ответ — это максимум по времени числа «текущих» интервалов.

Приём: сканирующая прямая (sweep line). Мы превращаем каждый интервал [s, e) в два события: «началось» и «закончилось». Идём по событиям слева направо, поддерживаем счётчик активных занятий cur, и берём максимум best.

Почему работает: каждый раз, когда начинается занятие, нужна ещё одна аудитория (cur += 1), а когда заканчивается — аудитория освобождается (cur -= 1). Максимальное значение cur за весь проход и есть минимально достаточное число аудиторий.

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

Сложность: сортировка 2n событий — O(n log n), проход — O(n).

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

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

Куда дальше