Разностный массив
Разностный массив — это способ представить массив через изменения между соседними элементами. Он особенно полезен, когда нужно много раз прибавлять одно и то же число ко всем элементам некоторого отрезка.
Формула
Главное преимущество появляется при обработке отрезков. Чтобы прибавить число \(x\) ко всем элементам с индексами от \(l\) до \(r\), достаточно изменить только две границы разностного массива: \(d_l\) увеличить на \(x\), а \(d_{r+1}\) уменьшить на \(x\) (если \(r+1\) существует). После всех изменений исходные значения получают восстановлением через суффиксные суммы? Нет: здесь используется именно последовательное сложение слева направо, то есть префиксное накопление.
Пусть массив равен \([4,4,4,4,4]\), а нужно прибавить \(3\) к элементам с 2-го по 4-й. Его разностный массив: \([4,0,0,0,0]\). Изменяем границы: \(d_2\mathrel{+}=3\), \(d_5\mathrel{-}=3\). Получаем \([4,3,0,0,-3]\). Восстановление последовательным сложением даёт \([4,7,7,7,4]\). Операция над отрезком выполнена за \(O(1)\).
Разностный массив не хранит сами значения элементов, а хранит их приращения. Обработка отрезка массива с помощью разностей ускоряет обновления, но для получения конкретного значения после изменений нужно выполнить накопление от начала массива. Это отличается от суффиксных сумм, которые считают суммы справа налево.
В разностном массиве нужно прибавить \(5\) к отрезку \([3;6]\). Какие изменения выполняют?
Главное
- Разностный массив хранит изменения между соседними элементами.
- Прибавление числа к отрезку выполняется изменением левой границы и позиции сразу после правой.
- Исходный массив восстанавливают последовательным сложением элементов разностного массива.