差分算法Java

一、差分

一般地,差分主要用于让一个序列某一特定范围内的所有值都加上或减去一个常数。

2、定义
const int N = 100010;
int n; //n数组长度
//定义两个一维整形数组 a为原数组,b为差分数组
int f[N],diff[N];  
 
//根据定义可知
diff[i] = f[i] - f[i-1];
//以此类推
diff[1] = f[1];
diff[2] = f[2] - f[1];
diff[3] = f[3] - f[2];
...
diff[i] = f[i] - f[i-1];
 
//转化一下,求数组b的前缀和,根据上面公式可得
  diff[1]+diff[2]+...+diff[i]
= f[1]+(f[2]-f[1])+...+(f[i]-f[i-1])
= f[i]
 
//由此可知,原序列为差分序列的前缀和序列
f[i] = diff[1]+diff[2]+diff[3]+...+diff[i];
 

序列中每个元素与其前一个元素的差

作用

当我们需要对数列f的某个区间所有项进行加m操作时,只需要将这个数列分解为一个差分数列diff之后,对左区间边界diff[L] 项进行加m操作,对右边界 diff[R+1]项进行减m操作,最后根据拆分时的公式:f[i] = diff[1]+diff[2]+diff[3]+...+diff[i];=f(i-1)角标 + di 反过来合并即可得到我们需要的数列d。不管多少个区间如此操作皆可。

diff[l] += 1;diff[r+1] -= 1便可以实现上述操作,且降低了时间复杂度

f :  3   4   1   5   6   2   7   9

diff:3   1  -3   4   1  -4   5   2

列如:都+1改变后的f

[0,6]项

f 4    5    2    6    7    3    7    9

diff:4    1   -3    4    1    -4    4    2

那么

例如diff[2]+=1;diff[4]-=1

f 3    4   2   6   6    2   7    9

diff:3   1   -2   4   0   -4     5    2

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值