浅谈差分数组的原理及简单应用

本文介绍了差分数组的概念,包括其定义、性质,并详细阐述了如何利用差分数组快速处理区间加减操作和询问区间和问题。通过对差分数组的理解,可以实现O(n)的时间复杂度来解决相关问题,文中还引用了具体例题以加深理解。
摘要由CSDN通过智能技术生成

一、差分数组的定义及用途
注意:差分数组只能解决先区间修改再查询的题。
1.定义:

对于已知有n个元素的离线数列d,我们可以建立记录它每项与前一项差值的差分数组f:显然,f[1]=d[1]-0=d[1];对于整数i∈[2,n],我们让f[i]=d[i]-d[i-1]。

2.简单性质:

(1)计算数列各项的值:观察d[2]=f[1]+f[2]=d[1]+d[2]-d[1]=d[2]可知,数列第i项的值是可以用差分数组的前i项的和计算的,即d[i]=f[i]的前缀和。
(2)计算数列每一项的前缀和:第i项的前缀和即为数列前i项的和,那么推导可知

即可用差分数组求出数列前缀和;

3.用途:

(1)快速处理区间加减操作:

假如现在对数列中区间[L,R]上的数加上x,我们通过性质(1)知道,第一个受影响的差分数组中的元素为f[L],即令f[L]+=x,那么后面数列元素在计算过程中都会加上x;最后一个受影响的差分数组中的元素为f[R],所以令f[R+1]-=x,即可保证不会影响到R以后数列元素的计算。这样我们不必对区间内每一个数进行处理,只需处理两个差分后的数即可;

(2)询问区间和问题:

由性质(2)我们可以计算出数列各项的前缀和数组sum各项的值;那么显然,区间[L,R]的和即为ans=sum[R]-sum[L-1];

设a数组为初始的序列,我们要在这个数祖上进行一系列的区间修改。
设d数组为差分数组,定义差分数组的第i个值为d[i]=a[i]-a[i-1]。
那么我们得知a[i]=d[1]+d[2]+d[3]+d[4]+…+d[i],所以如果要求某个区间段内的和,我们可以先将差分数组的前缀和求出来。再根据x和y进行累加。
如果现在我们要将(x,y)区间内的数都加c。
那么根据d[i]=a[i]-a[i-1]得知,当a序列更新为之后,只有d[x]和d[y+1]变了。
d[x]+=c;
d[y+1]-=c;
所以每次更新我们都可以进行这样的操作。
最后查询时,我们先将差分数组的前缀和求出来,然后输出就可以了。
这样,复杂度为O(n)。

例题:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值