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