Поиск минимального/максимального элемента на интервале

Реализация аналогична поиску суммы элементов на интервале, за исключением того, что теперь вычисляться будет массив block_min[] (block[max]). Время работы данного алгоритма также останется пропорциональным sqrt n

Изменения всех элементов интервала с запросом о величине отдельных элементов

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

  • увеличить/уменьшить все элементы интервала [left; right] на одну и ту же величину;
  • получить значение i-го элемента массива;

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

Например, в случае данных, указанных на рисунке значение элемента a[3] будет равно 5 + 6 = 11, а значение элемента a[1] будет равно 2+(-5) = -3.

table

Применим к массиву, указанному на рисунке операцию «Прибавить 10 ко всем элементам интервала [0; 4]»

В этом случае произойдут следующие изменения:

  • первый блок полностью принадлежит изменяемому интервалу, поэтому его изменения будут фиксироваться в массиве block_additive[].
  • второй блок лежит в изменяемом интервале частично, поэтому все изменения будут производиться непосредственно с элементами.

Результат изменений показан на рисунке, измененные значения выделены серым фоном:

table

Изменение всех элементов на интервале с запросами о сумме элементов интервала

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

Возможное состояние для исходного массива из 9 элементов показано на рисунке.

table

Задача о поддержании множества

Пусть есть множество чисел, для которого возможны операции добавления/удаления элемента, запрос k-го по порядку элемента и запрос о принадлежности числа X множеству.

Идея реализации. Будем хранить числа в упорядоченном виде блоками по sqrt n штук. Для каждого блока будем хранить наименьшее и наибольшее число (в этом случае легко выполняется проверка на возможную принадлежность числа X конкретному блоку).

При добавлении/удалении элементов требуется выполнять переформирование блоков, поэтому для хранения блока следует использовать структуру данных, позволяющую за время O(1) выполнять удаление/добавление как первого, так и последнего элемента.

Пример переформирования блоков показан на рисунке.

Пусть в начале было множество из четырех элементов (9, 12, 13, 20), добавление нового элемента (7) ведет к изменению длины блока и расположения элементов в блоках. Добавляемое число выделено зеленым цветом.

table
Последнее изменение: Суббота, 15 Август 2020, 02:34