1,什么是前缀和,如构造前缀和。 2,什么是差分,如何构造差分。

登录以参加训练计划

差分数组的基础概念

差分数组并不是简单的相邻元素之差,而是用来表示原数组中每个位置与其前一位置的增量变化。对于一个长度为 nn 的数组 AA,其对应的差分数组 DD 的定义如下:

  • D[0]=A[0]D[0] = A[0] (第一个元素保持不变)
  • 对于 1i<n1 \leq i < nD[i]=A[i]A[i1]D[i] = A[i] - A[i-1]

但是,当我们使用差分数组进行区间更新时,我们并不直接计算相邻元素的差值,而是利用差分数组的特性来进行高效的区间操作。

区间更新与差分数组

假设我们有一个数组 AA 和一个差分数组 DD,并且我们想要对 AA 中从索引 llrr(包括两端)的每个元素都增加一个值 xx。我们可以只在差分数组 DD 上做两个修改:

  • D[l]+=xD[l] += x:表示从 ll 开始增加 xx
  • D[r+1]=xD[r+1] -= x:表示到 rr 结束后不再增加 xx

然后,通过对差分数组 DD 求前缀和,我们可以恢复原始数组 AA 更新后的状态。

例子

原始数组

A=[1,2,3,4,5] A = [1, 2, 3, 4, 5]

构建差分数组

根据上述规则,差分数组 DD 可以初始化为: D=[1,1,1,1,1] D = [1, 1, 1, 1, 1] 这里 D[0]=A[0]D[0] = A[0],而 D[i]=A[i]A[i1]D[i] = A[i] - A[i-1] 对于 i>0i > 0

进行区间更新

假设我们要将 AA 中索引 1 到 3(即第二个到第四个元素)的值各增加 2。我们只需在差分数组 DD 上做以下两步:

  • D[1]+=2D[1] += 2
  • D[4]=2D[4] -= 2

更新后的差分数组变为: D=[1,3,1,1,1] D = [1, 3, 1, 1, -1]

恢复原始数组

为了得到更新后的 AA,我们需要对差分数组 DD 求前缀和: A[0]=D[0]=1 A'[0] = D[0] = 1 A[1]=D[0]+D[1]=1+3=4 A'[1] = D[0] + D[1] = 1 + 3 = 4 A[2]=D[0]+D[1]+D[2]=1+3+1=5 A'[2] = D[0] + D[1] + D[2] = 1 + 3 + 1 = 5 $ A'[3] = D[0] + D[1] + D[2] + D[3] = 1 + 3 + 1 + 1 = 6 $ $ A'[4] = D[0] + D[1] + D[2] + D[3] + D[4] = 1 + 3 + 1 + 1 - 1 = 5 $

因此,更新后的数组 AA' 是: A=[1,4,5,6,5] A' = [1, 4, 5, 6, 5]

总结

在这个例子中,我们展示了如何使用差分数组高效地执行区间更新。关键点在于,我们只需要在差分数组的两端进行修改,然后通过求前缀和就可以恢复更新后的原数组。这种方法特别适用于需要频繁进行区间更新的情况,因为它避免了对每个元素逐一进行修改,从而大大提高了效率。

章节 1. 一维前缀和与差分

开放

题目 尝试 AC 难度
P1231  数组求和之前缀和 21 3 9
P1273  GESP 202409 四级 黑白方块 5 1 10

章节 2. 二维前缀和与差分

开放

题目 尝试 AC 难度
T1282  最大子矩阵 8 2 10

章节 3. 综合应用

开放

题目 尝试 AC 难度
P1231  数组求和之前缀和 21 3 9
 
参加人数
2
创建人