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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Забавно сколько всего интересного есть в глубинах GNU C++. Совсем недавно e-maxx находил там бор (правда без суф. ссылок).

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

      Не помните, где он там?

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

        Скорее всего, имелась в виду встроенная реализация patricia tree. Если порыться в ссылках отсюда, то можно будет найти упоминание этой штуки в документации и код с примером.

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

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