LA, Heavy-Light Decomposition, Euler tour trees (10 марта)
- 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 обычно нужен только если дерево меняется
- LA
- Предподсчитаем всё (n2, 1)
- Двоичные подъёмы (nlogn, logn)
- heavy-light decomposition (n, logn)
- longest-path decomposition (n, sqrtn)
- ladder decomposition (nlogn, 1)
- Идея: храним двоичные подъёмы только от листьев (предподсчёт: dfs в offline)
- Микро-макро эвристика: Compress(tree, logn/4) + ответ на запрос
- Минимум на путях дерева в Offline за O*(1) [окончание]