差分算法

差分算法

差分算法可以用来维护区间的加减

我们假定有一个数组 \(a={1,2,3,4}\)

\(b\) 为数组 \(a\) 的差分数组。

\[b_i=\begin{cases} a_i - a_{i-1}&i \in [2,n]\\ a_1 & i=1 \end{cases} \]

根据给定的数组 \(a={1,2,3,4}\) 我们很容易得知数组 \(b={1,1,1,1}\)

我们求数组 \(b\) 的前缀和数组,我们发现:

\[sum_b={1,2,3,4} \]

\[a={1,2,3,4} \]

数组 \(b\) 的前缀和数组和原数组 \(a\) 一样,我们再举个例子:

\[a={1,2,2,4} \]

\[b={1,1,0,2} \]

\[sum_b={1,2,2,4} \]

我们搞清楚这个性质之后我们再回到原问题,维护区间和加减。

假定,我们要让区间 \([L,R]\) 的值整体加 \(k\) , 我们让 \(b[L] + k\) , 再让 \(b[R+1] - k\) 再求前缀和就可以得到增加后的原数组 \(a\) 了。

用刚才的例子:

\[a={1,2,2,4} \]

\[b={1,1,0,2} \]

我们让区间 \([2,3]\)\(1\) (下表从 \(1\) 开始)

\(b[L]+1\) 得: \(b={1,2,0,2}\)

如果在这个时候求前缀和:

\(a={1,3,3,5}\)

我们发现区间 \([2,4]\) 都加上了 \(1\)不符合预期

所以,我们还要进行下一步操作:

\(b[R+1]-1\) 得: \(b={1,2,0,1}\)

再求前缀和:

\(a={1,3,3,4}\)

我们发现区间 \([2,3]\) 加上了 \(1\)符合预期

这样一来,我们就知道了如何用差分维护区间和加减

一般来说,如果有 \(q\) 个操作,那么我们可以现在差分数组 \(b\) 上操作 \(q\) 次,再统一求前缀和,这样就可以做到 \(O(n)\) 修改了。

posted @ 2024-01-31 18:08  fedoralxy  阅读(17)  评论(0编辑  收藏  举报