前缀和与差分复习

前缀和是一种极其优秀的线性数据结构,也是一种重要的思想,它可以极大地降低区间查询的复杂度。

1、一维前缀和

预处理:
for(int i = 1; i <= n; i++)
sum[i] = sum[i - 1] + a[i];
某子段和:
sum[R] - sum[L - 1];

2、二维前缀和(注意需要两个数组)

预处理:
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
sum[i][j] = sum[i][j - 1] + sum[i - 1][j] - sum[i - 1][j - 1] + a[i][j];
某子矩阵和:
sum[x2][y2] - sum[x2][y1 - 1] - sum[x1 - 1][y2] + sum[x1 - 1][y1 - 1];

3、一维差分

预处理:
for(int i = 1; i <= n; i++)
sum[i] = sum[i - 1] + b[i];
修改区间:
b[L] += x;
b[R + 1] -= x;

4、二维差分(注意需要两个数组)

预处理:
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= m; j ++ )
b[i][j] += b[i - 1][j] + b[i][j - 1] - b[i - 1][j - 1]
修改区间:
b[x1][y1] += c;
b[x2 + 1][y1] -= c;
b[x1][y2 + 1] -= c;
b[x2 + 1][y2 + 1] += c;

上一篇:1368. 燃烧木棍


下一篇:前缀和与差分 (图文并茂 超详细整理)