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

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

Написал решение(6479167) на задачу "Вставка ключевых значений"(Тренировка СПбГУ B #10 Декартово дерево Light), у которого асимптотика , но, видимо, с громадной константной, ибо TL 37.

Решение заключается в следующем: будем честно хранить несуществующие элементы в виде нулей, а также запомним их позиции. Т.е. сначала у нас будет декартово дерево по неявному ключу с M нулями и set с их позициями(1, 2 ... M).

Теперь, чтобы обработать Insert(i, k), мы найдем в сете позицию самого первого нуля, начиная с i-той позиции, и, если такая позиция существует, удалим его из сета и декартова дерева. Осталось только вставить k на позицию i.

Такое решение валится тестом

131072 131072
1 1 1 ... 1 1 1

На нем у меня работает 5,5 секунды

Это у меня руки кривые, или существует более адекватное решение?

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

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

В коде без пол-литра не разберешься, однако, нашел баг : приоритеты должны быть случайными, а не pr[i] = i, random_shuffle не поможет. pr[i] = (rand() << 10) + rand() получает АС за 434 мс.

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

    Спасибо, действительно с (rand() << 15) | rand() прошло. А почему random_shuffle не поможет?