HLD, Link-Cut, линейное MST (24 мая 2017)
- [15 минут] Heavy-Light decomposition
- Идея: разбиение дерево на пути, каждая вершина ровно в одном пути.
- Лемма про число прыжков: на любом пути к корню не более log2n прыжков между путями.
- Тонкости реализации (как создать HLD, как прыгать по ней вверх, как считать функцию на пути без LCA)
- Общая идея решения задач: сперва решить на отрезке массива деревом отрезков или BST, затем обобщить до путей на дереве, добавив HLD
- Признаки задачи, к которым применимо HLD: задача про дерево, в дереве меняются веса вершин/рёбер
- [30 минут] Link-Cut-Tree
- Идея: динамическое разбиение вершин корневого дерева на пути. База: каждая вершина − самостоятельный путь.
- Операция Expose, время работы k*logn.
- Амортизированное оценка на k = O(logn). Потенциал − число тяжелых рёбер, покрытых путями.
- Операция MakeRoot. Изменение потенциала − не более чем число лёгких рёбер на пути, то есть, O(logn)
- Функция на пути дерева; link(a,b), cut(a,b): MakeRoot(a) + MakeRoot(b) + O(1)
- Сравнение с Euler-Tour-Tree: кроме link и cut умеет считать функцию на пути, находить lca
− Перерыв −
- [35 минут] MST за линейное время
- Проверка MST на минимальность за линейное время (ссылаемся на RMQ за O(1), которым на самом деле не владеем)
- Алгоритм = 3 шаги Борувки + построить остов F от случайной половины рёбер + выкинуть F-тяжёлые + построить от оставшихся
- Лемма о количестве F-тяжёлых рёбер с доказательством: (n - 1)(1/p - 1)
- Оценка времени в среднем O(n+m)
- [13 минут] (RMQ → LCA) + LCA-Offline = RMQ-Offline за O((n+m)α). Только если останется время!
- Предподсчитали за линию вектора ListOfLeftBorders[R]. Перебираем запросы по возрастанию Ri.
- При фиксированном Ri отрезок [1..Ri] разбивается на [1..Min1] (Min1..Min2] (Min2..Min3) и т.д. При этом a[Min1] ≤ a[Min2] ≤ a[Min3] и т.д.
- Если Lj лежит в (Mini..Mini+1], то ответ для запроса Min[Lj..Rj] равен a[Mini+1]
- Реализация: минимумы лежат в стеке, мы отрезки (Mini..Mini+1] в СНМ. Добавляя a[R], снимаем вершину стека, объединяем соответствующие множества.