LA, Heavy-Light Decomposition, Euler tour trees (5 марта 2016)
- LA (Level Ancestor)
- Предподсчитаем всё (n2, 1).
- Уже умеем делать: Offline за O(n+m); Двоичные подъёмы (nlogn, logn)
- Алгоритм Вишкина за [O(n), O(logn)]. Упражнение: использовать 4-х русских, чтобы получить [O(n), O(1)]
- longest-path decomposition, ladder decomposition [O(nlogn), O(1)]
- Идея: храним двоичные подъёмы только от листьев (предподсчёт: dfs в offline)
- Микро-макро эвристика (4-русских): обрубаем все поддеревья размера менее logn/4
- Euler Tour Trees
- идея, Эйлеров Обход Дерева, содержащий ориентированные рёбра
- ребро дерево ↔ вершина treap
- вершина дерева → рёбра дерева
- ребро → обратное ребро
- get(v): вершина дерева → ребро → вершина treap → подняться до корня treap
- makeRoot(v): start = any outgoing edge
- link(a, b): makeRoot(a), makeRoot(b), concat
- cut(a, b): makeRoot(a), e = (a, b), split off [e..rev(e)]
- Heavy-Light decomposition
- идея
- лемма про число прыжков
- тонкости реализации (как создать HLD, как прыгать по ней)
- общая идея решения задач: сперва решить на отрезке массива, затем обобщить до дерева, heavy-light обычно нужен только если дерево меняется
- Link-Cut-Tree: общая идея без доказательства