Skip to main content

前缀和 & 差分

Summary

前缀和(Prefix Sum)预处理数列前若干项之和,把区间求和的查询降到常数时间:记前 k 项之和为 Sk,则从 a 到 b 的区间和等于 Sb 减去 S(a-1)。差分(Difference)是与前缀和互逆的策略,可看作求和的逆运算,由相邻两项之差 Ak=Sk-S(k-1) 还原出原数列,常用于对某段区间整体加减的批量修改。文末给出 std 的 partial_sum 与 adjacent_difference 两个对应的 STL 函数。

参考资料​

前缀和​

前缀和(Prefix Sum)可以简单理解为「数列的前 nn 项的和」,是一种重要的预处理方式,能大大降低查询的时间复杂度。

Sk=∑i=1kAi=A1+A2+⋯+AkS_k=\sum_{i=1}^k A_i=A_1+A_2+\dots+A_k ∑i=abAi=Sb−Sa−1\sum_{i=a}^b A_i=S_b-S_{a-1}

差分​

差分(Difference)是一种和前缀和相对的策略,可以当做是求和的逆运算。

Ak=Sk−Sk−1A_k=S_k-S_{k-1}

STL​

例题​

给定由 nn 个正整数组成的序列 a1,a2,…,ana_1, a_2,\dots, a_n 和 mm 个区间 [li,ri][l_i,r_i],分别求这 mm 个区间的区间和。