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

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

прошу помощи по задаче:

http://informatics.mccme.ru/moodle/mod/statements/view3.php?id=1974&chapterid=2789#1


не могу придумать как проталкивать информацию о необходимости обменов на отрезке. точнее придумал как это сделать за O(h):

пусть есть дерево curr_tree - нужный нам отрезок. корень нужно непосредственно обменять с его парой(это будет либо левый, либо правый потомок). Т.е. разделяем curr_tree на left, right, M1, M2 (где M1, M2 деревья, состоящие из 1 вершины - те, которые мы хотим поменять местами). У left и right изменяем информацию о перевороте. Потом склеиваем как left + M2 + M1 + right. но такая реализация TLится.

может можно проталкивать за O(1)?
  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

13 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится
Можно сделать два декартовых дерева (для чётных и для нечётных). А потом отрезать от одного и подвешивать к другому. Точно так же, как в этой задаче можно было сделать пять декартовых деревьев.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    так разве не тоже самое по сложности получится? Если я правильно понял, нужно будет отрезать от каждого дерева по вершинке и прикрепить их наоборот?
    • 13 лет назад, # ^ |
        Проголосовать: нравится +2 Проголосовать: не нравится
      Вы неправильно поняли.

      Предлагается следующее. В каждый момент времени храним два декартовых дерева, одно содержит только элементы с чётными индексами, другое  с нечётными. Для обработки запроса делаем следующее:
      1. Разрежем каждое из деревьев на три: (oddleft, oddmiddle, oddright) и (evenleft, evenmiddle, evenright), где oddmiddle и evenmiddle будут содержать элементы, принадлежащие отрезку из запроса.
      2. Склеим обратно, поменяв местами oddmiddle и evenmiddle
      odd = merge(oddleft, evenmiddle, oddright)
      even = merge(evenleft, oddmiddle, evenright)
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
разобрался. спасибо за помощь!