HLD, Link-Cut, линейное MST (21 мая 2018)
- LCA: алгоритм Тарьян (из забытого старого)
- [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)
- [skipped] [ушло на практику] Оценка времени в худшем min(O(n2), O((n+m)logn))