Сумма на отрезке
Сумма на отрезке — это сумма элементов массива, расположенных между двумя заданными границами. Для частого вычисления таких сумм используют кумулятивную сумму, также называемую префиксной суммой.
Формула
Если элементов немного, сумму можно получить последовательным сложением. При большом количестве запросов удобнее один раз построить массив префиксных сумм \(P\), где \(P_i\) — сумма элементов от начала массива до позиции $i включительно.
Для отрезка, начинающегося с первого элемента, используется отдельный случай: \(S(1,r)=P_r\). В программировании часто добавляют нулевой элемент \(P_0=0\). Тогда формула становится единой: \(S(l,r)=P_r-P_{l-1}\).
Пусть массив равен \([4, 7, 2, 5, 3]\). Нужно найти сумму на отрезке \([2;4]\): \(7+2+5=14\). Префиксные суммы: \(P=[0,4,11,13,18,21]\). Поэтому \(S(2,4)=P_4-P_1=18-4=14\).
Сумма на отрезке \([l;r]\) включает оба конца. Ошибка возникает, если вычесть \(P_l\) вместо \(P_{l-1}\): тогда элемент с индексом \(l\) будет потерян. Также не следует путать сумму на отрезке с количеством элементов на отрезке: количество равно \(r-l+1\), а сумма зависит от значений элементов.
Префиксные суммы равны \(P_0=0\), \(P_1=6\), \(P_2=10\), \(P_3=15\). Чему равна сумма на отрезке \([2;3]\)?
Построение префиксных сумм занимает \(O(n)\) времени, а получение одной суммы на отрезке — \(O(1)\). Поэтому метод особенно полезен, когда нужно обработать много запросов к одному массиву. Общая работа с такими диапазонами рассматривается в статье обработка отрезка массива, а сами запросы — на странице запросы к массиву.
Главное
- Сумма на отрезке \([l;r]\) включает элементы с индексами от \(l\) до \(r\).
- При префиксных суммах используется формула \(S(l,r)=P_r-P_{l-1}\).
- Префиксные суммы позволяют отвечать на каждый запрос за \(O(1)\) после подготовки массива.