Centroid decomposition — различия между версиями
(→Статическая центроидная декомпозиция) |
(→Статическая центроидная декомпозиция) |
||
Строка 29: | Строка 29: | ||
|definition = Есть взвешенное дерево <tex>t</tex> из <tex>n</tex> вершин, в каждой вершине которого написаны положительные целые числа. Также по-прежнему даны числа <tex>W >= 0</tex> и <tex>l</tex>. Требуется найти количество пар <tex>(i, j)</tex> вершин дерева, таких что расстояние между ними не превосходит <math>l</math> по числу ребер и не превосходит <math>W</math> по сумме весов. | |definition = Есть взвешенное дерево <tex>t</tex> из <tex>n</tex> вершин, в каждой вершине которого написаны положительные целые числа. Также по-прежнему даны числа <tex>W >= 0</tex> и <tex>l</tex>. Требуется найти количество пар <tex>(i, j)</tex> вершин дерева, таких что расстояние между ними не превосходит <math>l</math> по числу ребер и не превосходит <math>W</math> по сумме весов. | ||
}} | }} | ||
+ | Для решения новой задачи применим ту же идею, что и была до этого - разделяй и властвуй. Но в случае дерева эта идея будет формулироваться так : разделим дерево на несколько поддеревьев <tex>t_1, t_2,..., t_k</tex> одной из вершин (<math>v</math>), таких что каждое из них имеет размер, не превосходящий <math> \frac{n}{2}</math>. Такая вершина <math>v</math> будет называться центроидом дерева (доказательство её существования и алгоритм нахождение см. далее). Предположим, что мы сумели найти центроид за <math>O(n)</math>, где <math>n</math> - размер дерева. Тогда, как и в упрощенной версии задачи - рекурсивно найдем ответ для всех поддеревьев <tex>t_1, t_2,..., t_k</tex>, после чего попытаемся найти недостающие пары вершин, находящиехя в разных поддеревьях и удовлетворяющих вопросу задачи. | ||
+ | |||
+ | === Лемма о центроиде === | ||
+ | |||
+ | === Алгоритм нахождения центроида в произвольном дереве === | ||
== Динамическая центроидная декомпозиция (дерево центроидной декомпозиции) == | == Динамическая центроидная декомпозиция (дерево центроидной декомпозиции) == |
Версия 00:28, 14 июня 2017
Centroid decomposition (рус. центроидная декомпозиция) - это структура данных, позволяющая отвечать на запросы на дереве. Чаще всего это запросы, связанные с нахождением функции на вершинах, связанных неравенством на расстояние между ними в дереве. Также иногда применяется для запросов на путях в дереве.
Содержание
Введение
Рассмотрим 2 задачи на обычном массиве (в дальнейшем мы будем их обобщать на случай дерева): Задача 1
Задача: |
Есть массив | положительных целых чисел из элементов и числа и . Требуется найти количество пар индексов массива, таких что и .
Задача 2:
Задача: |
Есть прямая дорога, на которой расположены 1) дан город 3) дан город , в котором находится больной и требуется найти такой город , что минимально возможное. 2) дан город и сказано, что больше он не будет принимать больных и сказано, что теперь он может принимать больных | городов. В некоторых городах есть госпитали, которые могут принимать больных. Поступают запросы вида :
Для начала решим обе задачи. Первая задача решается методом qevide&conqure (рус. разделяй и властвуй) - давайте разделим массив на 2 массива и и рекурсивно решим задачу для каждого из них. Осталось научиться находить количество искомых пар , таких что . Для этого воспользуемся другой известной техникой - методом двух указателей. Посчитаем массив префиксных сумм для правой половины и суффиксных ( ) - для левой. Заведем два указателя ( и ). Изначально установим . Пока и
будем уменьшать на . Если после этого , то к ответу прибавим , посго, увеличим на <math/math>. Так будем делать, пока . В конце сложим текущий ответ и ответы для половин массива - получим ответ на задачу.
Вторая задача имеет запросы на изменение и поэтому надо применить динамическую версию qevide&conqure - дерево отрезков. Построим дерево отрезков, поддерживающее 2 вида запросов : присвоение в точке и минимум на отрезке. Изначально сделаем так, чтобы дереву отрезков соответствовал массив , такой что , если в i-м городе принимает госпиталь и иначе. Когда в каком-то городе открывается/закрывается госпиталь - делаем запрос на изменение в дереве отрезков. Когда требуется узнать ближайщий госпиталь к -му городу, можно воспользоваться одной из следующих идей : а) ( ) Бинарным поиском ищем ближайший слева и ближайший справа к i-му городу госпиталь (такой город , что ). Для этого внутри бинарного поиска каждый раз делаем запрос на поиск минимума в дереве отрезков. б) ( ) Будем одним спуском/подъемом по дереву определять, куда нам нужно идти (в левое или правое поддерево), тем самым делая одновоременно и бинарный поиск, и спуск/подъем по дереву.
Статическая центроидная декомпозиция
Перейдем к обобщению поставленных задач на случай дерево. Начнем, как и полагается, с первой:
Задача: |
Есть взвешенное дерево | из вершин, в каждой вершине которого написаны положительные целые числа. Также по-прежнему даны числа и . Требуется найти количество пар вершин дерева, таких что расстояние между ними не превосходит по числу ребер и не превосходит по сумме весов.
Для решения новой задачи применим ту же идею, что и была до этого - разделяй и властвуй. Но в случае дерева эта идея будет формулироваться так : разделим дерево на несколько поддеревьев
одной из вершин ( ), таких что каждое из них имеет размер, не превосходящий . Такая вершина будет называться центроидом дерева (доказательство её существования и алгоритм нахождение см. далее). Предположим, что мы сумели найти центроид за , где - размер дерева. Тогда, как и в упрощенной версии задачи - рекурсивно найдем ответ для всех поддеревьев , после чего попытаемся найти недостающие пары вершин, находящиехя в разных поддеревьях и удовлетворяющих вопросу задачи.