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

Автор yermak0v, 13 лет назад, По-русски

Доброго времени суток %username%.
Сегодня столкнулся с задачей, в которой решение чуть-ли не брут с помощью set'а, и релиз халявный, но не все "коту масленица".
Разглашать задачи и их решения нельзя до окончания отборов, и поэтому я ничего и не буду говорить.
Но мизерная часть задачи — надо найти количество элементов меньших либо равных данного, или же просто номер элемента в set'е, и, увы, сделать это — у меня не получилось. Надеюсь понять, что за задача не будет легко :)
У меня есть итератор на начало set'а, и итератор на элемент. Как найти расстояние от первого ко второму, быстрее чем функция distance (т.е. не за линейную сложность), и возможно ли это вообще?
P.S. Итераторы двунаправленные (стандартно в set'е), если кто не знает.

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

»
13 лет назад, скрыть # |
 
Проголосовать: нравится +19 Проголосовать: не нравится

Нет, нельзя. Нужно писать свое бинарное сбалансированное дерево, где можно поддерживать размеры поддеревьев и искать расстояние между вершинами за О(высоты дерева), то есть за логарифм. Легче всего пишется декартово дерево.

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

    А по чем Вы учили дерамиду? Где, по вашему, наиболее доступно объяснено?
    А то я читал несколько раз — бесполезно.

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

      Мне вот это больше всего понравилось

      http://habrahabr.ru/post/101818/

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

        Пожалуй это лучшее, из того что есть. Помню, после прослушивания лекции, смог на контесте в ЗШ написать эту штуку, при том что до этого не писал вообще ни одной СД, и даже не уверен, что слышал про бинарные деревья поиска. Так что спасибо Виталию Гольдштейну, за прекрасную лекцию)

»
13 лет назад, скрыть # |
 
Проголосовать: нравится +6 Проголосовать: не нравится

Ранее всплывала подобная тема: http://codeforces.me/blog/entry/5631#comments, я там оставлял линк на обсуждение на uva: там прикладывали исходник с использование реализованного в GNU C++ RB-Tree с добавление поддержки размеров поддеревьев, но, правда, на MSVC++ понятное дело не компилируется.

»
13 лет назад, скрыть # |
 
Проголосовать: нравится +3 Проголосовать: не нравится

Просто создатели посчитали, что для класса "множество" это не нужная операция. Поддержка же её требует дополнительных вычислений, что может негативно сказаться для обычного использования стандартного класса. Подобные вещи в stl встречаются в разных местах, например, ведь никто не мешает сделать итератор класса vector так, чтобы он оставался валидным после изменения размера массива, но никто так делать не будет, потому что это бы потребовало больше тактов, хотя в редких случаях это доставляет головной боли. (например любимое многими представление графа с "пулом" рёбер)