前缀和与差分
简单明了的区间有限次操作,区间加减上的亲密两兄弟。
前缀和书面意思就是前缀相加的和,如一个序列为{1,3,5,7,6,4,8},其前缀和的计算为每一项为前n项相加的和第一项的值就是本身,第二项的值是第一项加第二的和也就是1+3等于4,以此类推,我们便可以得到原数组的前缀数组就是{1,4,9,16,22,26,34}。
那么我们知道了前缀和的定义,他到底能做些什么事情呢?
举一个最简单的栗子,我们有n此操作,每次都要求L到R区间内的和,那么对于还没有了解到前缀和的我们会怎么做呢?
首先有n此操作,一个循环从1到n,L到R的区间和,第二个循环从L到R进行累加。n此操作的时间复杂度就是O(n * m);
有了前缀和,我们可以进行的操作就是用R下标表示的前缀和数组数值减去L下标的前缀和数组数值,就得到了区间和,那么也就是求区间和的时间复杂度就是O(1);
差分数组 是计算数组的差,其表示方式就是用数组后一元素来减去数组的前一个元素所得到的值放入数组,这个过程就是差分。
拿上一个的数组来说原数组是{1,3,5,7,6,4,8},进行差分后的结果就是{1,2,3,4,-1,-2,4}
同样我们进行n此操作使L到R区间的数进行+x运算,双重for是最经典的做法,有了差分我们就可以在差分数组中的第L个元素进行+x,使R+1的位置元素进行减一,使O(n * m)的时间复杂度变为了O(1);