Одномерные структуры данных (СПБГУ МатМех, весна 2013, спецкурс 344-й группы)
СНМ
- Постановка задачи
- Реализация за O(NlogN + M) --- color[v] и list[color], перекрашиваем меньший список
- Реализация за O(1*) --- сжатие путей и подвешивание меньшего к большему
- Доказательство времени работы O(logN) для эвристики "подвешивание меньшего к большему"
RSQ и RMQ
- Не меняющиаяся массив (длина N)
- Сумма на префиксе за O(1)
- Сумма на отрезке за O(1)
- Минимум на префиксе за O(1)
- Минимум на отрезке фиксированной длины за O(1)
- Минимум на произвольном отрезке за O(1) с предподсчетом O(N2): min[l, r]
- Минимум на произвольном отрезке за O(1) с предподсчетом O(NlogN): Sparse Table
- Меняющиаяся массив (изменения типа a[i] := x)
- Одномерное дерево отрезков (на массиве длины 2k, с запросом снизу)
- Отложенные операции для задачи произвольном
- Не меняющиаяся матрица (ширина W, высота H)
- Сумма в углу за O(1)
- Сумма в прямоугольнике за O(1)
- Минимум в углу за O(1)
- Минимум в прямоугольнике фиксированного размера за O(1)
- Минимум на произвольном прямоугольнике за O(1) с предподсчетом O(WHlogWlogH)
LCA
- Полезный предподсчет: глубины вершин, время входа, время выхода
- Проверить является ли a предком b за O(1)
- Наивное решение за O(расстояния между вершинами)
- Двоичные подъемы за O(NlogN) памяти и O(logN) времени
- Реализация #1: сперва поднимаем нижнюю вершину до глубины верхней, затем прыгаем параллельно на 2k
- Реализация #2: поднимаем первую вершину на 2k и за O(1) проверяем, попалили мы в предка второй
- Сведение к RMQ за O(N)
- Решение в Offline с СНМ за O((N+M)*)
Одномерное дерево отрезков
- Реализация снизу
- Используем ровно 2N памяти
- Построение за O(N)
- Время ответа на запрос O(log(длины запроса))
- Обрабатываем запросы: min(l, r) sum(l, r), change(i, x)
- Реализация сверху
- Используем до 4N памяти (можно соптимизить до 3N, но не меньше)
- Построение за O(N)
- Время ответа на запрос: не более 2logN просмотренных вершин
- Запрос += на отрезке и min(l, r)
- Запрос += на отрезке и sum(l, r)
- Запрос = на отрезке и min(l, r)
- Запрос = на отрезке и sum(l, r)