Деревья отрезков (29 мая 2021)
- Вступление
- Время из общаги? Такси из общаги?
- Смотрим код 12A
- Пишем код аллокатора
- Мотивация
- Сама структура данных новые операции делать не умеет, но имеет меньше константу
- Это не только структура данных, но и идея, как можно представлять массив
- Простейшее дерево отрезков
- Идея для n=2k
- Хранение на массиве (индексация, как в куче)
- Основная теорема: любой отрезок разбивается на ≤ 2logn вершин дерева отрезков (2 на каждом уровне)
- Запрос сумма: снизу
- Запрос сумма: сверху
- Запрос изменить 1 элемент: снизу
- Запрос изменить 1 элемент: сверху
- Полностью снизу
- Хранение: индексация, как в куче; листья, начиная с n.
- Код функций get, change.
- Рисунок, показывающий, что мы работаем не с деревом, а с лесом
- Памяти 2n, время ответа на запрос O(log(r-l)), малая константа.
- Полностью сверху
- Обычный запрос (по аналогии с BST)
- Операции += и min. Операции = и +.
- Памяти 2n ≤ x ≤ 4n → 2n ≤ x ≤ 3n
- Динамическое (для массивов длины ∼109)
- Сверху (ссылки)
- Снизу (hashmap)
- Offline и сжатие координат.
- Персистентное: операции сверху. Можно сразу динамическое.
- Чем BST лучше дерева отрезков?
- Умеет вставку в i-е место, удаление, умеет reverse, автоматически динамическое
- В персистентном случае ровно n вершин (меньше памяти)
− Перерыв −
- 2D дерево
- Дерево отрезков сортированных массивов: сколько чисел на отрезке [L..R] имеют значение от x до y?
- Дерево отрезков сортированных массивов: k-я статистика на отрезке за O(log3n).
- Равносильность 2D-запроса на массиве и 2D-запроса на плоскости
- Можно в вершине хранить любую стуктуру данных
- Дерево отрезков декартовых деревьев: тоже самое, но можно менять элементы массивов
- Дерево отрезков деревьев отрезков
- Многомерный случай: k-мерное дерево отрезков (k-1-мерное в вершине)
- Ортогональные запросы и сканирующая прямая
- Для каждой точки посчитать, сколько прямоугольников её покрывают. Offline за O(nlogn) и сжатие координат.
- Для каждого прямоугольника посчитать число точек в нём. Offline за O(nlogn) и сжатие координат.
- Online версии предыдущих двух задач = persistent scanline + бинпоиск во время запроса
- [skipped] [В практику] Задача "даны отрезки на прямой, запрос: сколько пересекаются с отрезком-запросом"
- [skipped] [В практику] Количество пар вложенных отрезков на прямой
- k-я порядковая статистика за O(log2n) и O(logn).
- Вспомогательная задача для понимания спуска по дереву: k-я единица в массиве − решение бинпоиском по ответу за O(log2n), решение спуском по дереву
- O(log2n): персистентное дерево отрезков ⇒ ∀ l, r ∃ t[l], t[r+1] ⇒ бинпоиск по ответу
- O(logn): параллельный спуск по двум деревьям
- [skipped] Задачи
- [skipped] [В практику] Какая операция подходит для дерева отрезков: ассоциативная, аддитивная (min, max, sum, product матрица, gcd, композиция перестановок, количество отрезков белого цвета)
- [skipped] [В практику] Задача "числа добавляются, удаляются, говорить количество чисел со значением от L до R".
- [skipped] Фенвик (не успеем?)
− Перерыв −
- КД-дерево
- Общая идея. Что умеет?
- Доказательство времени n1/2 на запрос
- Получения всех точек в прямоугольнике за O(k + logn)
- Fractional Cascading
- Запрос за O(logn) для дерева отрезков сортированных массивов
- Найти в каждом из k массивов lowerbound не за O(klogn), а за O(k + logn).
- Количество точек в полуплоскости
- Решение для малого n: есть всего n2 разных поворотов
- Решение для большого n (nlogn и 3 из 4 веток рекурсии)
- Объединяем