Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
прога_билеты.docx
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
2.98 Mб
Скачать

Доказательство

Теорема:

 =  .

Доказательство:

Положим  .

Заметим, что   и   не принадлежат одновременно либо правому, либо левому поддереву  , потому как тогда бы соответствующий сын находился на большей глубине, чем  , и также являлся предком как   так и  , что противоречит определению  . Из этого замечанию следует, что   лежит между   и   и, следовательно, принадлежит отрезку  . По построению мы также знаем, что:

  1. Любая вершина дерева имеет свое значение меньшим либо равным значению её детей.

  2. Поддерево с корнем в   содержит в себе подмассив  .

Суммируя, получаем, что   имеет минимальное значение на отрезке, покрывающем  , и принадлежит отрезку  , отсюда  .

Сложность

Следующий алгоритм строит декартово дерево за  . Используя Сведение задачи LCA к задаче RMQ, получаем: препроцессинг для   —   и ответ на запрос —  . В итоге получили   с построением за   и ответом на запрос за  .

Процесс построения дучи по массиву:

Stack.push(A[0])

For (i = 1; i < n; i++)

If(A[i] >= A[stack.top])

s.top()->right = i;

s.push(i);

else

while(A[i] < A[s.top])

cur = s.top();

s.pop();

i->left = cur;

s.top()->right = I;

s.push(i);

Restricted RMQ

Алгоритм Фарака-Колтона, Бендера (алгоритм Фарах-Колтона, Бендера) — применяется для решения за   времени специального случая задачи RMQ (поиск минимума на отрезке), в котором соседние элементы входной последовательности различаются на ±1. Может быть использован также для решения задачи LCA.

Вход: последовательность   длины  , соседние элементы которой отличаются на ±1. Выход: ответы на онлайн запросы вида «позиция минимума на отрезке  ».

Алгоритм

Части, из которых состоит ответ на запрос RMQ

Данный алгоритм основывается на методе решения задачи RMQ с помощью разреженной таблицы (sparse table, ST) за  .

Чтобы избавиться от логарифма используется предподсчёт ответа для небольших подстрок входной последовательности. Разделим последовательность   на блоки длины  . Для каждого блока вычислим минимум на нём и определим   как позицию минимального элемента в  -том блоке.

На новой последовательности   построим разреженную таблицу. Теперь для ответа на запрос RMQ , если   и   находятся в разных блоках, нам необходимо вычислить следующее:

  1. минимум на отрезке от   до конца содержащего   блока;

  2. минимум по всем блокам, находящимся между блоками, содержащими   и  ;

  3. минимум от начала блока, содержащего  , до  .

Ответом на запрос будет позиция меньшего из эти трёх элементов.

Второй элемент мы уже умеем находить за   с помощью   и ST. Осталось научиться находить минимум по отрезку, границы которого не совпадают с границами блоков.

Минимум внутри блока

Утверждение:

Если две последовательности   и   таковы, что все их элементы на соответствующих позициях различаются на одну и ту же константу (т.е.  ), то любой запрос RMQ даст один и тот же ответ для обеих последовательностей.

Таким образом, мы можем нормализовать блок, вычтя из всех его элементов первый. Тем самым мы значительно уменьшим число возможных типов блоков.

Утверждение:

Существует   различных типов нормализованных блоков.

Соседние элементы в блоках отличаются на ±1. Первый элемент в нормализованном блоке всегда равен нулю. Таким образом, каждый нормализованный блок может быть представлен ±1-вектором длины  . Таких векторов  .

Осталось создать   таблиц — по одной для каждого типа блока. В такую таблицу необходимо занести предподсчитанные ответы на все возможные запросы минимума внутри блока соответствующего типа, коих  . Для каждого блока в   необходимо заранее вычислить его тип. Таким образом мы получили возможность отвечать на запрос минимума по любой части блока за  , затратив на предподсчёт   времени.