作业介绍
一维差分
定义
差分是一种和前缀和相对的策略,可以当做是求和的逆运算。
这种策略的定义是令
$$b_i=\begin{cases}a_i-a_{i-1}\,&i \in[2,n] \\ a_1\,&i=1\end{cases} $$其中 是属于的意思, 其含义为 处于 之间的时候。
可得
例如:
性质
- 的值就是 的前缀和,即 。
证明:
等号右边利用差分的定义可以写成
化简后就剩一个 。
$$\begin{aligned} a_i&=b_1+b_2+\cdots+b_i\\ &=a_1+(a_2-a_1)+\cdots+(a_i-a_{i-1})\\ &=a_i \end{aligned} $$例如:
- 计算 的前缀和
其中 为求和符号,例如 的含义就是 。
证明:
$$\begin{aligned} &\ \ \ \ \ a_1+a_2+\cdots+a_n\\ &=b_1+(b_1+b_2)+\cdots+(b_1+b_2+\cdots+b_n)\\ &=n\times b_1+(n-1)\times b_2+\cdots+1\times b_n\\ &=\sum\limits_{i=1}^n(n-i+1)b_i \end{aligned} $$- 给一个序列某一段 连续区间 内的所有数字都增加一个 。( 正负无所谓)
暴力写法如下:
while (q--)
{
cin >> l >> r >> c;
for (int j = l; j <= r; j++)
a[j] += c;
}
使用差分数组可以在 的时间内修改。只需要执行
b[l] += c, b[r + 1] -= c
证明:
- 当我们对 以后,首先易得出 的值并未改变。所以 的值也不变。
根据性质 ,原数组的值就是差分数组的前缀和可得该结论。
例如 由于 没变,所以 也没变。
进一步可得 的值都不变。
- 当执行 以后,可得 都加了
举例:
- 由于 ,因此
- $a_{l+1} = b_1 + b_2 + \cdots + \mathbf{b_l}+b_{l+1}$ 由于 ,因此
- $a_n = b_1 + b_2 + \cdots + \mathbf{b_l}+\cdots+b_n$ 由于 ,因此 *
- 当执行 以后,可得 都减了
- $a_{r + 1} = b_1 + b_2 +\cdots + \mathbf{b_l} + \cdots+ \mathbf{b_{r + 1}}$
由于 ,,因此正负抵消 不变
- $a_{n} = b_1 + b_2 +\cdots + \mathbf{b_l} + \cdots+ \mathbf{b_{r + 1}}+\cdots+b_n$
由于 ,,因此正负抵消 不变
注意事项
- 注意是给一段连续区间内的所有数字都去增加,而不是挑选若干个数字进行修改。
- 注意使用的时候,保证 。
做题步骤
- 先预处理差分数组,通过
b[i] = a[i] - a[i - 1]求出。 - 通过差分的修改操作,修改数组
b - 对区间修改操作转化到差分数组的修改上。
- 对
b数组求前缀和得到原数组的值。
题目
认领作业后才可以查看作业内容。
- 状态
- 正在进行…
- 题目
- 3
- 开始时间
- 2026-3-13 0:00
- 截止时间
- 2036-3-20 23:59
- 可延期
- 24 小时