Link-Cut Tree — различия между версиями
Lena (обсуждение | вклад) |
Lena (обсуждение | вклад) (→Решение задачи в частном случае) |
||
Строка 25: | Строка 25: | ||
= min\{0, (\Delta min(l) + w(l)) - w(v), (\Delta min(r) + w(r)) - w(v)\} \\ | = min\{0, (\Delta min(l) + w(l)) - w(v), (\Delta min(r) + w(r)) - w(v)\} \\ | ||
= min\{0, \Delta min(l) + \Delta w(l), \Delta min(r) + \Delta w(r)\}</tex> | = min\{0, \Delta min(l) + \Delta w(l), \Delta min(r) + \Delta w(r)\}</tex> | ||
+ | |||
+ | Чтобы найти минимум на пути, надо вызвать <tex>splay(v)</tex>, а затем сравнить минимум <tex>v</tex> и минимум её левого ребенка. |
Версия 19:57, 8 июня 2014
Link-cut tree — это структура данных, которая хранит лес деревьев и позволяет выполнять следующие операции:
- искать минимум на пути от вершины до корня;
- прибавлять константу на пути от вершины до корня;
- link(u,w) -- подвешивать одно дерево на другое;
- cut(v) -- отрезать дерево с корнем в вершине v.
Решение задачи в частном случае
Сначала научимся выполнять эти операции для частного случая, в котором все деревья - это пути. Для этого представим путь в виде splay-дерева, в которм ключи выбираются равными глубине вершины.
Тогда операциям link и cut будут соответсвовать merge и split.
Чтобы прибавлять заданное число на пути от вершины до корня, будем в каждой вершине хранить велечину
, которая равна разнице между весом вершины и весом её ролителя. Для корня это значение равно весу самого корня. Поэтому вес вершины определятся следующим образом:сумма
Чтобы прибавить
на пути от вершины до корня, надо вызвать , прибавить к и вычесть от , чтобы сохранить веса вершин которые находятся ниже в пути.Для поиска минимума поступим аналогично. Определим
таким образом, чтобы сохранялся следующий инвариант: . Пусть и дети , тогда
Чтобы найти минимум на пути, надо вызвать
, а затем сравнить минимум и минимум её левого ребенка.