Блог пользователя VitalyKo

Автор VitalyKo, 7 месяцев назад, перевод, По-русски

Пусть у нас есть значения в вершинах (если на ребрах, то все хорошо и никаких проблем нет) и хотим отвечать на запросы на путях с помощью Мо.

Стандартная реализация работала бы примерно так:

    move l, r
    ...
    if (u != lca && v != lca) toggle(lca);
    ans[query_id] = ...;
    if (u != lca && v != lca) toggle(lca);

Что вполне нормально, если включение/выключение вершины работает за $$$O(1)$$$, но это не всегда так. У нас может быть какой-то набор значений в вершине $$$v$$$ и включение требует $$$size(values[v])$$$ операций. Тогда эта лишняя проверка сломает ассимптотику.

У меня есть несколько идей как это можно было бы исправить:

1) Как-то поменять алгоритм чтобы не приходилось дополнительно проверять LCA

2) Изменить сортировку, чтобы получить небольшое количество отрезков запросов, на которых lca один и тот же. Тогда можно один раз включать его в начале отрезка запросов и выключать в конце.

3) Сделать новое дерево, где в каждой вершине лежит только одно значение, но при это все так же возможно представить любой путь как отрезок (не повысив при этом суммарный размер слишком сильно)

Но у меня нет идей как делать что-либо из этого. Буду рад помощи)

Полный текст и комментарии »

  • Проголосовать: нравится
  • +76
  • Проголосовать: не нравится