Декартовы деревья и деревья отрезков (20 марта 2014)
- Декартово дерево [кодим]
- Декартово дерево по явному ключу [code]
- Декартово дерево по неявному ключу [code]
- Подсчет функции размер, сумма, минимум на отрезке
- reverse отрезка [code]
- RSQ, RMQ, LCA, Фенвик
- Дерево отрезков, запросы снизу.
- Построение за O(n), запрос get за O(logn), запрос change за O(logn) [code]
- Памяти 2n [code]
- На самом деле время на запрос get O(logLen), Len = R - L + 1
- Умеем изменять значение и искать минимум быстрее logn ⇒ умеем сортировать массив быстрее nlogn
- Дерево Фенвика для операций a[i] = x, getSum(l, r): n памяти, еще меньше константа [code]
- RMQ в Offline за O*(1) [code]
- LCA в Offline за O*(1) [code]
- LCA в Online двоичными подъемами. [code]
- Подсчет функций минимум и сумма на пути дерева двоичными подъемами [code]
- Подсчет функций на пути в дереве в Offline за O(дерева отрезков) = O(logn)
- Подсчет min на пути в дереве в Offline с помощью СНМ
- Корневая эвристика [если останется время]
- Отложенные операции (вспомним структуру данных "количество точек в прямоугольнике")
- Not read Разбиение на куски постоянного размера (запрос up(L, R, x): на отрезке [L..R] "a[i] = max(a[i], x)", запрос get(L, R): посчитать сумму на отрезке)
- Not read Куски изменяющегося размера, split, rebuild (вставка и удаление в массив за √ n )