Блог пользователя Sehnsucht

Автор Sehnsucht, история, 9 лет назад, По-русски

Несколько раз встречал задачи, которые можно было бы решить, если найти, какому из n отрезков на прямой принадлежит точка с координатой x, за время log(n)

1. Отрезки могут пересекаться
2. Есть некоторые условия — нужно взять отрезок с наименьшей длиной либо с наименьшим номером в списке либо с наименьшим левым концом

Как решать эту задачу с этими условиями? Спасибо

  • Проголосовать: нравится
  • +13
  • Проголосовать: не нравится

»
9 лет назад, # |
Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

Если нет вложенных, то можно двумя бинпоисками + запросом минимума на отрезке(ДО, ДД, спарс)

  • »
    »
    9 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    Спасибо! Но это значит, что после сортировки отрезков у них в порядке возрастания следуют оба конца, как то: (1,5)->(3,7)->(4,9)->(5,10), и при сортировке по второму элементу список получится точно такой же. А что, если вложенные отрезки есть и после сортировки по второму элементу вместо списка (1,2,3,4,5) получится например (5,3,2,1,4)?

»
9 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Можно написать дерево отрезков, которое умеет выполнять такие запросы: обновить минимум на отрезке, найти минимум в точке. Все это достаточно просто можно сделать с помощью отложенных операций.

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится +11 Проголосовать: не нравится

    Так проще, да:) Кстати можно и без отложенных операций — снизу (так еще проще на мой взгляд, хотя многие с этим не согласны). Пример для максимума на последнем контесте: 11795678

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      А, да, точно. Я тоже так пишу для простых операций, но почему-то в этот раз не заметил :)

»
9 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Если пересекающиеся есть.

Можно посортить по l. Потом делать бинпоиск по l и получить префикс отрезков которые нам подойдет и на этом префиксе нам нужно выбрать какой-то минимум по тем, у кого правая граница хотя бы r. Можно завести персистентное ДО. Версия — номер отрезка в посортированном порядке. Элементы — номера/длины в позиции r.