Centroid decomposition — различия между версиями
(→Введение) |
(→Введение) |
||
Строка 18: | Строка 18: | ||
Вторая задача имеет запросы на изменение и поэтому надо применить динамическую версию qevide&conqure - [[Дерево_отрезков._Построение|дерево отрезков]]. Построим дерево отрезков, поддерживающее 2 вида запросов : прибавление в точке и минимум на отрезке. Изначально сделаем так, чтобы дереву отрезков соответствовал массив <math>b[]</math>, такой что <tex>b[i] = \begin{cases} | Вторая задача имеет запросы на изменение и поэтому надо применить динамическую версию qevide&conqure - [[Дерево_отрезков._Построение|дерево отрезков]]. Построим дерево отрезков, поддерживающее 2 вида запросов : прибавление в точке и минимум на отрезке. Изначально сделаем так, чтобы дереву отрезков соответствовал массив <math>b[]</math>, такой что <tex>b[i] = \begin{cases} | ||
− | 0, | + | 0, if there is a hospital in i-th town \\ |
− | 1, | + | 1, otherwise \\ |
\end{cases}</tex>. | \end{cases}</tex>. | ||
Версия 00:05, 14 июня 2017
Centroid decomposition (рус. центроидная декомпозиция) - это структура данных, позволяющая отвечать на запросы на дереве. Чаще всего это запросы, связанные с нахождением функции на вершинах, связанных неравенством на расстояние между ними в дереве. Также иногда применяется для запросов на путях в дереве.
Содержание
Введение
Рассмотрим 2 задачи на обычном массиве (в дальнейшем мы будем их обобщать на случай дерева): Задача 1:
Задача: |
Есть массив | положительных целых чисел из элементов и числа и . Требуется найти количество пар индексов массива, таких что и .
Задача 2:
Задача: |
Есть прямая дорога, на которой расположены 1) дан город 3) дан город , в котором находится больной и требуется найти такой город , что минимально возможное. 2) дан город и сказано, что больше он не будет принимать больных и сказано, что теперь он может принимать больных | городов. В некоторых городах есть госпитали, которые могут принимать больных. Поступают запросы вида :
Для начала решим обе задачи. Первая задача решается методом qevide&conqure (рус. разделяй и властвуй) - давайте разделим массив на 2 массива и и рекурсивно решим задачу для каждого из них. Осталось научиться находить количество искомых пар , таких что . Для этого воспользуемся другой известной техникой - методом двух указателей. Посчитаем массив префиксных сумм для правой половины и суффиксных ( ) - для левой. Заведем два указателя ( и ). Изначально установим . Пока и будем уменьшать на . Если после этого , то к ответу прибавим , посго, увеличим на <math/math>. Так будем делать, пока . В конце сложим текущий ответ и ответы для половин массива - получим ответ на задачу.
Вторая задача имеет запросы на изменение и поэтому надо применить динамическую версию qevide&conqure - дерево отрезков. Построим дерево отрезков, поддерживающее 2 вида запросов : прибавление в точке и минимум на отрезке. Изначально сделаем так, чтобы дереву отрезков соответствовал массив , такой что .