This repository has been archived on 2022-06-22. You can view files and clone it, but cannot push or open issues or pull requests.
usaco-guide/content/4_Silver/Prefix_Sums.md
2020-06-17 15:18:07 -07:00

2.2 KiB

id title author
prefix-sums Prefix Sums Darren Yao, Eric Wei

Let's say we have a one-indexed integer array \texttt{arr} of size N and we want to answer Q queries of the following form: compute \texttt{arr[L]+arr[L+1]+}\cdots\texttt{+arr[R]}.

Standard

Additional Resources

  • CPH 9.1

Tutorial

Let's use the following example with N = 6:

todo convert the below to array because tabular isn't supported

\begin{center}
    \begin{tabular}{ c | c c c c c c c }
    \toprule
        Index $i$ & \color{gray}{0} & 1 & 2 & 3 & 4 & 5 & 6 \\
        \texttt{arr[i]} & \color{gray}{0} & 1 & 6 & 4 & 2 & 5 & 3 \\
    \bottomrule
    \end{tabular}
\end{center}

Naively, for every query, we can iterate through all entries from index a to index b to add them up. Since we have Q queries and each query requires a maximum of O(N) operations to calculate the sum, our total time complexity is O(NQ). For most problems of this nature, the constraints will be N, Q \leq 10^5, so NQ is on the order of 10^{10}. This is not acceptable; it will almost always exceed the time limit.

Instead, we can use prefix sums to process these array sum queries. We designate a prefix sum array \texttt{prefix}. First, because we're 1-indexing the array, set \texttt{prefix}[0]=0, then for indices k such that 1 \leq k \leq n, define the prefix sum array as follows:

\texttt{prefix[k]}=\sum_{i=1}^{k} \texttt{arr[i]}

Basically, what this means is that the element at index k of the prefix sum array stores the sum of all the elements in the original array from index 1 up to k. This can be calculated easily in O(N) by the following formula:

\texttt{prefix[k]}=\texttt{prefix[k-1]}+\texttt{arr[k]}

For the example case, our prefix sum array looks like this:

Now, when we want to query for the sum of the elements of \texttt{arr} between (1-indexed) indices L and R inclusive, we can use the following formula:

\sum_{i=L}^{R} \texttt{arr[i]} = \sum_{i=1}^{R} \texttt{arr[i]} - \sum_{i=1}^{L-1} \texttt{arr[i]}