【总结】差分原理详解(通俗易懂)
什么是差分?
差分就是将数列中的每一项分别与前一项数做差。
首先一个数组 :1 2 5 4 7 3
那么差分之后 :1 1 3 -1 3 -4 -3
其实就是
注意得到的差分序列第一个数和原来的第一个数一样(相当于第一个数减0)
差分序列最后比原序列多一个数(相当于0减最后一个数)
差分一般使用场景:
给出 n 个数,再给出 m 个询问,每个询问给出 l,r,x,要求你在 l 到 r 上每一个值都加上 x,而只给你 O(n) 的时间范围,怎么办?
如果暴力,时间复杂度就是 O(n^2)
如果线段树或者树状数组,时间复杂度就是 O(mlogn)
所以这里用差分,时间复杂度就是 O(n)
具体操作:
先另外开一个专门差分的数组
假如在 3~8 的区间上加上 5,那我们在差分数组中的 3 位置上加上一个 5 (原因暂时不懂没关系,用笔先跟着模拟),再在8+1的位置上减一个5,如此操作完 m 次
接着运用公式 遍历一遍数组。那么你会发现在 3~8 的区间上,你已经使差分数组全部加上了 5 。
来几道例题练练手
代码就自己去操作吧,多练才会!
再来一道经典例题,专门卡时间,只能差分或者线段树或者树状数组才能过
题解:https://blog.****.net/weixin_44668898/article/details/100751973