前缀和与差分 模板

一维前缀和

s[i] = a[1] + a[2] + ... + a[i]
a[l] + a[l + 1] + a[l + 2] + ... + a[r] = s[r] - s[l - 1]

二维前缀和

前缀和与差分 模板_第1张图片

s[i, j] = 第i行j列格子左上部分 所有元素的和
以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为:
`s[x2, y2] - s[x1 - 1, y2] - s[x2, y1 - 1] + s[x1 - 1, y1 - 1]`

一维差分

1. 给定a[]数组,操作是对a[]数组[l, r]中的每一个数加上c
2. 假想b[]数组,b[]数组是a[]数组的差分数组,a[]数组是b[]数组的前缀和数组
3. 初始a[]全0,b[]全0,[1, 1] + a[1] 、[2, 2] + a[2] 、[3, 3] + a[3] 、 [4, 4] + a[4] 、... 、[n, n] + a[n]
4. 给区间[l, r]中的每个数加上c:b[l] += c, b[r + 1] -= c

二维差分

给以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵中的所有元素加上c
s[x1, y1] += c, s[x2 + 1, y1] -= c, s[x1, y2 + 1] -= c, s[x2 + 1, y2 + 1] += c

你可能感兴趣的:(算法)