之前我们经常遇到的差分的应用就是区间修改,比如区间增加1,就可以使
,
,然后前缀和就是原来的数组了。
如果我们对加上一个首项为
公差为
的等差数列,上述的差分数组肯定不行了,相当于需要对每一个点都进行一次更改,都加
,但是可以考虑一下,每一个点都加
,不就相当于把现在的一阶差分数组当成原数组,然后对这个数组再做一次差分吗,这样的话刚刚那个区间内部凡是
的位置,都可以通过这个二阶差分修改两个端点实现,然后我们来模拟一下这个过程。
对于一个序列
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
如果再区间加一个首项为
公差为
的等差数列的话,就会变成下面的样子
0 | 1 | 2 | 3+a | 4+a+d | 5+a+d*2 | 6+a+d*3 | 7 | 8 | 9 |
0 | 1 | 1 | a+1 | d+1 | d+1 | d+1 | 1-a-d*3 | 1 | 1 |
0 | 1 | 0 | a | d-a | 0 | 0 | -a-d*4 | a+d*3 | 0 |
操作的区间是红色部分,在二阶差分中发生变化的实际上只有四个值,如果操作区间为,二阶差分发射变化的实际只有
并且可以看出,变化后,二阶差分中的值变化如下
d2[l]=d2[l]+a;
d2[l+1]=d2[l+1]+d-a;
d2[r+1]=d2[r+1]-a-d*(r-l+1);
d2[r+2]=d2[r+2]+a+(r-l)*d;
这样就可以通过修改二阶差分的四个值实现对原数组的一个区间加上一个首项为公差为
的等差数列了
还原原数组很简单,我们知道差分和前缀和互为逆运算,所以对二阶差分做一个二阶的前缀和就是原来的数组了