1. 前缀和与差分数组基础概念
前缀和(Prefix Sum)和差分数组(Difference Array)是算法竞赛中常用的两种数据处理技巧,它们能高效处理区间查询和区间修改问题。前缀和用于快速计算区间和,而差分数组则用于高效实现区间增减操作。
1.1 一维前缀和
对于长度为n的数组a(下标从1开始),其前缀和数组S定义为:
code复制S[i] = a[1] + a[2] + ... + a[i]
特别地,S[0] = 0。通过预处理得到前缀和数组后,计算任意区间[l,r]的和只需O(1)时间:
code复制sum(l,r) = S[r] - S[l-1]
C++实现示例:
cpp复制vector<int> a(n+1), S(n+1);
for(int i=1; i<=n; i++)
S[i] = S[i-1] + a[i];
1.2 一维差分数组
差分数组D是前缀和的逆运算,定义为:
code复制D[i] = a[i] - a[i-1] (i>1)
D[1] = a[1]
对区间[l,r]增加v的操作可以转化为:
code复制D[l] += v
D[r+1] -= v
之后通过前缀和即可恢复修改后的数组。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 高维前缀和与差分
2.1 二维前缀和
对于m×n的矩阵A,其前缀和S[i][j]表示从(1,1)到(i,j)的子矩阵和。计算时使用容斥原理:
code复制S[i][j] = A[i][j] + S[i-1][j] + S[i][j-1] - S[i-1][j-1]
查询子矩阵(x1,y1)到(x2,y2)的和:
code复制sum = S[x2][y2] - S[x1-1][y2] - S[x2][y1-1] + S[x1-1][y1-1]
2.2 二维差分
二维差分矩阵D的修改操作:
cpp复制void add(int x1, int y1, int x2, int y2, int v) {
D[x1][y1] += v;
D[x1][y2+1] -= v;
D[x2+1][y1] -= v;
D[x2+1][y2+1] += v;
}
