Отложенные операции

Материал из Algocode wiki
Версия от 16:12, 18 сентября 2019; KiKoS (обсуждение | вклад) (Новая страница: «Очень часто при решении задач на [дерево отрезков], [декартово дерево], Корневая декомпо...»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Очень часто при решении задач на [дерево отрезков], [декартово дерево], корневую декомпозицию требуется применять операцию изменения не к одному элементу массива, а к подотрезку. Замечание. Считается, что мы умеем применять эту операцию к одному элементу массива, и что мы умеем применять ее "по частям" (к разным подотрезкам массива по очереди).

Push-величины

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

Реализация

Приведем тут несколько мыслей и реализацию для дерева отрезков.

  • Вызывать push надо каждый раз, когда мы обращаемся к вершине, если между обращениями к ней могло примениться обновление
  • push-пометки надо не забывать очищать
  • если мы снимаем push-пометку с единичного элемента, то мы про нее можем забыть
Вот тут будет код




Автор конспекта: Константин Амеличев

По всем вопросам пишите в telegram @kik0s