差分数组原理与其前缀和的应用

看字你就应该知道,差分数组存的是什么了,即存的是每一项与前一项的差值。

例如这里有 A[] 数组:

A[] = 0  1  3  8  4  5  7 ( 下标从 0 开始,A[0] 为 0 )

根据 D[i] =  A[i] - A[i-1],我们可以得到 D[] 数组:

D[] = 0  1  2  5  -4  1  2

直观的,我们可以看出:

D[0] + D[1] =  A[1] = 1

D[0] + D[1] + D[2] = A[2] = 3

D[0] + D[1] + D[2] + D[3] = A[3] = 8

.........................................................

嗯,所以得到的 D[] 数组,再求一下前缀和,就可以知道 A[i] 的值了。

那这样有什么好处呢?

这样就可以 O(1) 处理区间更新,然后就能很快的求解单点查询了

还是上面的例子,现在我们使区间 [3,5] 全部加上 2 

然后你这样想:如何处理 D 数组,使得:

D[1] + D[2] + D[3] = A[3] + 2

D[1] + D[2] + D[3] + D[4]= A[4] + 2

D[1] + D[2] + D[3] + D[4] + D[5] = A[5] + 2

为了满足上面三个式子,我们应该使: D[1] += 2 或者 D[2] += 2 或者 D[3] += 2 

然而如果是 D[1] += 2 或者 D[2] += 2 的话,那我现在用 D 数组求 A[1] 或者 A[2] 的话,不就错了吗?

所以我只能使得 D[l] += 2 ,即这里的 D[3] += 2 ,这样我即可以 O(1)修改区间 [3,5],又不会使 1 ~ l 的运算出错。

 

同样!为了保证用 D 数组求 A[r+1] A[r+2] ..... 时不出错,我们必须消除 加 2 对他们的影响,因为 只是 [3,5] 加了 2 。

跟上面的思路一样,必须消除影响,即需要在 D[r] 或者 D[r+1] 、D[r+2] 的时候减去 2 ,这样前缀和时,加 2 减 2 消掉了,不会给后面造成影响。

那么如果 D[r] -= 2 ,算 A[r] 的时候就错了,因为这相当于 A[r] 没有更新 加 2 。

如果 D[r + 2] 减 2 的话,会使得算 A[r + 1] 的时候算错,因为这相当于 A[r + 1] 加了 2 。在 D[r + 3] 、D[r + 4] ......减 2 同理,都不行。

 

综上:我们需要在 D[l] += k ,D[r + 1] -= k ,以便保证算 [l,r] 的时候不会错,也消除了算[1,l] 和 [r + 1,n] 的影响。

 

转载于:https://www.cnblogs.com/Absofuckinglutely/p/11342005.html

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值