Несогласованные поддеревья. Реализация массового обновления — различия между версиями
Rybak (обсуждение | вклад) (→Присваивание) |
Rybak (обсуждение | вклад) |
||
Строка 6: | Строка 6: | ||
== Массовые операции == | == Массовые операции == | ||
− | Рассмотрим два примера: присваивание на отрезке | + | Рассмотрим два примера: прибавление и присваивание на отрезке |
+ | |||
+ | === Прибавление === | ||
+ | |||
+ | Чтобы делать запрос прибавления эффективно, будем хранить в каждой вершине дерева отрезков дополнительное значение {{---}} сколько надо прибавить ко всем числам этого отрезка целиком. Например, если приходит запрос "прибавить ко всему массиву <tex>a[0 \ldots n-1]</tex> число 2", то мы поставим в корне дерева число 2. Тем самым мы сможем обрабатывать запрос прибавления на любом подотрезке эффективно, вместо того чтобы изменять все O(n) значений. | ||
+ | |||
+ | Псевдокод: | ||
+ | : get(v, L, R, l, r, d) | ||
+ | :// v - текущая вершина, L и R - отрезок, соответственный текущей вершине, l и r - границы запроса, d - несогласованность | ||
=== Присваивание === | === Присваивание === |
Версия 23:09, 3 мая 2011
Несогласованные поддеревья
В несогласованном поддереве дерева отрезков в вершинах хранятся не истинные значения сумм на отрезках (по операции
). При этом в корне поддерева, которому соответствует отрезок хранится несогласованность . Для того чтобы узнать истинное значение нужно «собрать» все несогласованности на пути от вершины к корню дерева: . То есть для этого необходимо, чтобы вторая операция была ассоциативной. Если в вершине хранится истинное значение суммы, то — нейтральный элемент относительно операции .Массовые операции
Рассмотрим два примера: прибавление и присваивание на отрезке
Прибавление
Чтобы делать запрос прибавления эффективно, будем хранить в каждой вершине дерева отрезков дополнительное значение — сколько надо прибавить ко всем числам этого отрезка целиком. Например, если приходит запрос "прибавить ко всему массиву
число 2", то мы поставим в корне дерева число 2. Тем самым мы сможем обрабатывать запрос прибавления на любом подотрезке эффективно, вместо того чтобы изменять все O(n) значений.Псевдокод:
- get(v, L, R, l, r, d)
- // v - текущая вершина, L и R - отрезок, соответственный текущей вершине, l и r - границы запроса, d - несогласованность
Присваивание
Для того, чтобы присвоить всем элементам на отрезке новое значение, нужно этот отрезок разбить, как в обычном запросе, на
отрезков, и в соответствующие узлы добавить несогласованность: .