Деревья отрезков (10 мая 2017)
- C операциями снизу
- Общая идея для "суммы на отрезке".
- Хранение: индексация, как в куче; листья, начиная с n.
- Код функций get, change.
- Рисунок, показывающий, что мы работаем не с деревом, а с лесом
- Памяти 2n, время ответа на запрос O(log(r-l)), малая константа.
- C операциями сверху
- Обычный запрос (по аналогии с BST)
- Операции += и min. Операции = и +.
- Памяти 2n ≤ x ≤ 4n → 2n ≤ x ≤ 3n
- Динамическое (для массивов длины ∼109)
- Сверху
- Снизу
- Offline и сжатие координат.
- Персистентное: операции сверху. Можно сразу динамическое.
- 2D дерево
- Дерево отрезков сортированных массивов: сколько чисел на отрезке [L..R] имеют значение от x до y?
- Дерево отрезков сортированных массивов: k-я статистика на отрезке за O(log3n).
- Равносильность 2D-запроса на массиве и 2D-запроса на плоскости
- Дерево отрезков декартовых деревьев: тоже самое, но можно менять y-ки
- Дерево отрезков деревьев отрезков.
- Многомерный случай: k-мерное дерево отрезков
− Перерыв −
- Сканирующая прямая
- Для каждой точки посчитать, сколько прямоугольников её покрывают. Offline за O(nlogn) и сжатие координат.
- Для каждого прямоугольника посчитать число точек в нём. Offline за O(nlogn) и сжатие координат.
- Online версии предыдущих двух задач = persistent scanline + бинпоиск во время запроса
- k-я порядковая статистика за O(log2n) и O(logn).
- O(log2n): персистентное дерево отрезков ⇒ ∀ l, r ∃ t[l], t[r+1]
- O(logn): параллельный спуск по двум деревьям
- Вспомогательная задача для понимания спуска по дереву: k-я единица в массиве − решение бинпоиском по ответу, решение спуском
− Перерыв −
- Fractional cascading
- КД-дерево
- КД-дерево для получения всех точек в прямоугольнике за O(k + logn)
- Количество точек в полуплоскости (persistent + sqrt decomposition + 4-tree)