Codeforces Round 1133 (Div. 1, Div. 2) is coming soon! Register here. ×

Dsu with lazy propagation

Revision ru4, by pcheloveks, 2025-11-09 23:58:14

Трюк для DSU (disjoint set union), с которым я недавно столкнулся:

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

  1. Union — объединить множества, содержащие элементы v1 и v2.
  2. Add — для всех i в множестве, содержащем элемент v, прибавить некоторое значение x к a[i].

Чтобы поддерживать это эффективно, можно хранить неявные модификации в вершинах — аналогично ленивым обновлениям (lazy propagation) в дереве отрезков, но без явной передачи изменений вниз.

При запросе Add мы находим корень дерева, содержащего вершину v, и добавляем модификацию в этот корень. Когда нужно получить реальное значение a[i], мы сначала выполняем сжатие пути к корню и применяем модификации от корня. Во время сжатия пути (в процессе рекурсивного переподключения вершин) мы также применяем модификацию родителя к текущей вершине.

Для операции Union можно действовать двумя способами:

  1. Создать новую виртуальную вершину, которая станет родителем обоих компонентов.
  2. Прикрепить один корень к другому и применить обратную модификацию к поддереву, которое становится потомком.

Второй способ немного сложнее в реализации, особенно если модификации более сложные.

Spoiler

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
ru4 Russian pcheloveks 2025-11-09 23:58:14 1774 (опубликовано)
en2 English pcheloveks 2025-11-09 23:27:42 0 (published)
en1 English pcheloveks 2025-11-09 23:24:52 1928 Initial revision for English translation (saved to drafts)
ru3 Russian pcheloveks 2025-11-09 23:17:35 40
ru2 Russian pcheloveks 2025-11-09 23:16:17 4
ru1 Russian pcheloveks 2025-11-09 23:10:50 1883 Первая редакция (сохранено в черновиках)