Кружок обучения мастерству программирования при СПбГУ
Лекции группы A0 - Лекция 06 - Деревья отрезков
Note: Звездочкой отмечены темы, на которые на лекции времени не хватило.
Краткий план лекции на тему "Деревья отрезков"
Дерево отрезков
Модификация на отрезке
Динамическое дерево отрезков
Задачи на дерево отрезков
Метод сканирующей прямой
2D дерево отрезков
2D дерево отрезков, работающее online за O(logn)
Полный план лекции
Дерево отрезков
Собственно структура, округление до 2^k
Построение за O(n)
Реализация снизу, ровно 2n памяти
Реализация сверху
Запросы [L..R] += x, [L..R] = x (сверху)
Динамическое дерево отрезков
Моделирование BSTree с помощью дерева отрезков для x = 0..10^5
x = 0..10^9 => сжатие координат
Без сжатия координат = динамическое дерево : O(m*logM) памяти и времени
Оптимизация1 : отсекаемся, когда вершина содержит 1 элемент
* Оптимизация2 : tree.R = tree.L + 1
* Оптимизация3 : сжатое дерево => O(n) памяти
Задачи на дерево отрезков
Запросы [L..R] = c и для каждого цвета в конце сказать, сколько его [при сжатии координат [L,R] --> [L,R+1)]
Запросы [L..R] = c и по ходу отвечать, сколько различных отрезков
Есть множество чисел <= 10^5. Add, Del, GetMin, DelMin (моделируем кучу, ищем позицию min-а)
Дан массив за 10^5 чисел <= 10^9. GetMin, DelMin [заменям a[i] на inf]
Add, Del, Переход к минимальному числу >= x.
Дана строка, удаляются по очереди все символы и даны запросы-отрезки, нужно после каждого удаления
символа выводить список только что удаленных отрезков.
Посл-ть удалений дана Offline => max по времени на отрезке
Online => Разделяем каждый отрезок на O(logN) частей (вершин д.о.), а свежеудаленные вершины д.о. находим за O(logN)
Метод сканирующей прямой
2D. Max по длине посл-ть вложенных точек.
Max по вложенности множество отрезков [отрезок = точка]
Точка, покрытая Max числом прямоугольников
Запрос на прямоугольнике в Offline [прямоугольник = полоска - полоска]
Покрыть прямоугольником WxH множество точек Max по сумме весов
2D дерево отрезков
Предподсчет = O(nlogn). Запрос на прямоугольнике = O((logn)^2)
Значение в точке можно менять.
Если дерево сделать динамическим, сами точки можно менять.
Статический случай (значения в точках не меняются) => Запрос за O(logn)
Предподсчет для запроса за O(logn) [метод двух указателей]
Применение этой идеи к функции min [min на отрезке за O(loglogn), O(log*n), O(1)]
Модификация на прямоугольнике за O((logn)^2) [потом за O(nlogn) считаем значение во всех точках]