Несколько раз встречал задачи, которые можно было бы решить, если найти, какому из n отрезков на прямой принадлежит точка с координатой x, за время log(n)
1. Отрезки могут пересекаться
2. Есть некоторые условия — нужно взять отрезок с наименьшей длиной либо с наименьшим номером в списке либо с наименьшим левым концом
Как решать эту задачу с этими условиями? Спасибо
Если нет вложенных, то можно двумя бинпоисками + запросом минимума на отрезке(ДО, ДД, спарс)
Спасибо! Но это значит, что после сортировки отрезков у них в порядке возрастания следуют оба конца, как то: (1,5)->(3,7)->(4,9)->(5,10), и при сортировке по второму элементу список получится точно такой же. А что, если вложенные отрезки есть и после сортировки по второму элементу вместо списка (1,2,3,4,5) получится например (5,3,2,1,4)?
Можно написать дерево отрезков, которое умеет выполнять такие запросы: обновить минимум на отрезке, найти минимум в точке. Все это достаточно просто можно сделать с помощью отложенных операций.
Так проще, да:) Кстати можно и без отложенных операций — снизу (так еще проще на мой взгляд, хотя многие с этим не согласны). Пример для максимума на последнем контесте: 11795678
А, да, точно. Я тоже так пишу для простых операций, но почему-то в этот раз не заметил :)
Если пересекающиеся есть.
Можно посортить по l. Потом делать бинпоиск по l и получить префикс отрезков которые нам подойдет и на этом префиксе нам нужно выбрать какой-то минимум по тем, у кого правая граница хотя бы r. Можно завести персистентное ДО. Версия — номер отрезка в посортированном порядке. Элементы — номера/длины в позиции r.