差分算法
一、 复习一维前缀和
定义:
前缀和数组 s[i] 表示原数组 a[0] 到 a[i] 的和:
s[i] = a[0] + a[1] + ... + a[i]
应用场景:
- 快速计算区间
[l, r]的和:sum = s[r] - s[l-1] - 时间复杂度:预处理 O(n),查询 O(1)。
// 前缀和复习代码
int a[] = {0,1,3,5,7,9}; // 原始数组(1-based)
int b[6] = {0}; // 前缀和数组
for(int i=1; i<=5; i++)
b[i] = b[i-1] + a[i];
// b[3] = 1+3+5=9
二、差分引入
问题场景:对数组进行m次区间加减操作,最后输出数组元素
- 暴力法:O(mn)
- 差分优化:O(m+n)
差分定义:
- 原数组a的差分数组d满足: d[i] = a[i] - a[i-1] (i≥1)
- 前缀和与差分互为逆运算
容易发现,前缀和 与 差分 是一对互逆运算。