Всем привет. Нужна помощь в решении задачи: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=66&page=show_problem&problem=3145 Среди тех методов, которые напрашиваются: heavy-light декомпозиция с использованием неявных декартовых деревьев (чтобы можно было выполнять запросы первого типа — переподвешивание, с соответствующим перестроением декомпозиции (тяжелость-легкость ребер может измениться только на пути от переподвешиваемой вершины до корня её дерева), неявные декартовы деревья как раз нужны для отрезания и приклеивания отрезков друг к другу в вершинах до корня). Но грубая оценка для сложности такого переподвешивания O(n*log(n)). Any ideas? Спасибо.
С первого взгляда — в явном виде Linking-Cutting Trees. Почти то, что вы сказали, но heavy-light перестраивается по ходу (похоже на splay-дерево). Сделали операцию с вершиной — сделали так, чтобы весь путь от неё до корня стал одним деревом (возможно, порезав старые).
Утверждается, что это будет работать за O(log) операций с деревьями (т.е. O(log2) в сумме). Если написать внутрь splay-дерево, то будет почему-то (а PavelKunyavskiy даже умеет доказывать) работать за O(log) в сумме.
Сейчас это считается очень сложной структурой данных. Возможно, есть решение проще.
UPD: верю, что можно проще — у нас не "переворачиваются" поддеревья. Возможно, двоичными подъёмами или как-то еще. Сейчас времени чуть подумать и расписать, увы, нет. А LCT увидел, так как это очень общая структура.
Спасибо, будем разбираться.