посев травы
[Условие задачи](sic 2100)
Условие
Дан массив координат посевов () и число . Известно, что за одну минуту трава распространяется по грядке на целый метр в обе стороны! Найдите минимальное необходимое количество минут, чтобы трава заняла как минимум метров грядки.
Примеры
входные данные | выходные данные |
---|---|
3 1 3 9 9 | 2 |
Решение
Решение
Рост условной зоны из травы можно представить как отрезок
. Сначала у одного саженца отрезок
длины , потом , потом и так далее. Основная проблема заключается в том, что отрезки
саженцев могут пересечься между собой. В таком случае нам надо не считать пересечения по несколько раз.
Так как может быть большим, то проблематично разобрать попарно пересечения, особенно если мы не знаем их границы, но пересечение отрезков с уже известными границами найти легко!
Поэтому сделаем бинпоиск по ответу. Пусть прошло ровно минут. Каждый посев занимает отрезок . Пересечение отрезков это стандартная задача на сканлайн. Представим каждый отрезок, как два события :
- Открытие
(x_i - t, open)
- Закрытие
(x_i + t, close)
Отсортируем события по координате. Будем постепенно обрабатывать события, поддерживая количество открытых отрезков и координату последнего события.
Так как задача о нахождение площади пересечений отрезков является базовой и решается за . То итоговая задача имеет асимптотику .