一维差分数组
概念:
通俗点就是将an-an-1存储成为一个新数组,名为差分数组。
那么差分数组用来干嘛呢?联系之前提到过的前缀和的知识点,其可以对一个区间内所有的元素进行同样的加减(因为对差分数组进行加减,差分数组中的每一个元素的前缀和都会受到影响,其前缀和是an,也就是an会受到影响。)
例题
蓝桥3291 区间更新
import os
import sys
# 请在此输入您的代码
#若干组测试数据,不知道会输入几组时用这个结构
while 1:
try:
n, m = map(int, input().split())
a = list(map(int, input().split())) #读取数据
diff = [0] * (n + 1)
diff[0] = a[0] #初始化
for i in range(1,n):
diff[i] = a[i] - a[i - 1] #构造差分数组
for _ in range(m):
x, y, z = map(int, input().split())
x -= 1
y -= 1 #数据下标从1开始
diff[x] += z #从x下标+z
diff[y+1] -= z #从y下标开始恢复原样
a[0] = diff[0]
for i in range(1, n):
a[i] = diff[i] + a[i - 1] #根据递推式反推a[i]
b = " ".join(map(str, a))
print(b)
except:
break
二维差分数组
概念
依然可以用面积推导
想要让蓝色矩阵内所有元素加上3,注意上篇章前缀和推导的面积是和左上角有关,而这是跟右下角有关,因为这是差分数组,每一个元素进行加减会影响后面的元素,而并不是前面的,是想让某一个区间内所有的元素进行加减运算,而差分数组只要加一个元素,其后面的所有前缀和都会改变。(都会加3)那么用面积进行推导。
- 蓝色矩形面积=左图红色矩形面积-有图两个长方形的面积+正方形的面积
- 因为除了你想改变的矩阵,其他元素要保持不变,所以要减回去(-3)最后一个元素+3是因为其被算了两次。
总结:
差分数组就是两个元素相减组成的新数组
解题步骤:
- 构造差分数组
- 对差分数组对应元素进行加减
- 还原a[i]或者a[i][j]
- 进行输出