差分数组+等差数列

之前我们经常遇到的差分的应用就是区间修改,比如区间[1,5]增加1,就可以使a[1] = a[1] + 1a[6] = a[6] - 1,然后前缀和就是原来的数组了。

如果我们对[1,5]加上一个首项为a公差为d的等差数列,上述的差分数组肯定不行了,相当于需要对每一个点都进行一次更改,都加d,但是可以考虑一下,每一个点都加d,不就相当于把现在的一阶差分数组当成原数组,然后对这个数组再做一次差分吗,这样的话刚刚那个区间内部凡是+d的位置,都可以通过这个二阶差分修改两个端点实现,然后我们来模拟一下这个过程。

对于一个序列

第一行为原序列,往下依次是一阶差分和二阶差分
0123456789
0111111111
0100000000

 

如果再区间[3,6]加一个首项为a公差为d的等差数列的话,就会变成下面的样子

0123+a4+a+d5+a+d*26+a+d*3789
011a+1d+1d+1d+11-a-d*311
010ad-a00-a-d*4a+d*30

 

操作的区间是红色部分,在二阶差分中发生变化的实际上只有四个值,如果操作区间为[l,r],二阶差分发射变化的实际只有

d2[l],d2[l + 1],d2[r + 1],d2[r+2]

并且可以看出,变化后,二阶差分中的值变化如下

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;

这样就可以通过修改二阶差分的四个值实现对原数组的一个区间加上一个首项为a公差为d的等差数列了

还原原数组很简单,我们知道差分和前缀和互为逆运算,所以对二阶差分做一个二阶的前缀和就是原来的数组了

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值