首先来介绍一下差分数组(diff),diff[i]=a[i]-a[i-1],差分与前缀和的区别就是一个是减,一个是加。 由上面一维前缀和我们了解到前缀和可以快速求出一个区间的和。接下来我们看看差分有哪些妙用。 1.还原成a[i]:对差分数组进行前缀和能还原出a[i]。 2.区间修改:差分数组能够快速的对区间进行修改,时间复...
1、一维差分 通过上面我们知道了,什么是前缀和,那么什么是差分呢?就是在一区间减去某一个数或加上某一个数,假如 1 到 3 区间有1,2,3 三个数据,对它进行 + 1 与 - 2操作,再来求它的和,这就是典型的差分。 #include <bits/stdc++.h> using namespace std; const int N = 100000 + 10; int n,...
求前缀和公式:s[i]=s[i-1]+a[i] ,s[0]=0; 作用:求原数组[L,R]的数全部加上c ,即a[L]+c,a[L+1]+c, a[R]+c,可以通过操作差分数组进行计算: 即,b[L]+c,b[R+1]-c (1)原数组a在[1,3]区间加10,得到新数组c: (2)c[6]对应差分数组d (3)新的差分数组d与原差分数组b的区别:d...
一维差分:(1).差分数组:给定一个原数组a[1],a[2],...,a[n];在构造一个新的数组b[1],b[2],...,b[n] 使得a[i]=b[1]+b[2]+...+b[i],所以已知a[i]求b[i]的过程就是一个差分的过程,而已知b[i]求a[i]的过 程则是前缀和的过程,所以差分是前缀和的逆运算 差分的方法:a[0]=0,b...
1.前缀和与差分的转换关系 前缀和和差分是可以互相转换的。给定一个差分序列d,我们可以通过逆向差分得到原始序列a的前缀和序列。逆向差分操作如下: ``` a[1] = d[1] for i = 2 to n: a[i] = a[i-1] + d[i] ``` 2.前缀和与差分的应用场景 前缀和和差分在解决序列变化问题和优化算法中经常被...
前缀和差分是一对逆运算 1.一维前缀和 有一个长度为n的数组an:a1,a2…an; 对于前缀和:Si= a1+a2+…+ai 如何求Si,S[i] = s[i-1]+a[i] 前缀和可以快速求出原数组里面一段数的和。比如求一段区间[l,r],如果按照原来的做法,需要循环一遍,O(n),有前缀和的算法: ...
最后做一遍前缀和就好了。 C++ 标准库中实现了差分函数 std::adjacent_difference,定义于头文件 <numeric> 中。树上差分 树上差分可以理解为对树上的某一段路径进行差分操作,这里的路径可以类比一维数组的区间进行理解。例如在对树上的一些路径进行频繁操作,并且询问某条边或者某个点在经过操作后的值的时候,就可以...
差分:(前缀和的逆过程)问题引入:给你n个数a1 a2 a3 .. an.m次操作:每次给区间[L,R]上的每个数 + c.问你m次操作之后,每个数最终为多少.输出这个序列 方法①暴力模拟:复杂度O(n^2),太慢,不建议使用。方法②差分:先求差分数组d:d[i] = a[i] - a[i-1].(a为原数组) 例如: 原数组a: ...
既然前缀和是先预处理就能够非常方便地求出区间和,那差分就先修改标记 ( 标记标在差分数组 上),最后再来处理和 下面规定 为差分数组, 和 为修改范围, 为修改值 于是我们可以这样进行操作,在需要修改的区间的头和尾分别打上标记 和 的标记,即将 加上 ...
前缀和是指某序列的前n项和,可以把它理解为数学上的数列的前n项和,而差分可以看成前缀和的逆运算。合理的使用前缀和与差分,可以将某些复杂的问题简单化。 ①一维前缀和 题目:P8218 【深进1.例1】求区间和 给定n个正整数组成的数列a1,a2,⋯,an和m个区间[i,j],分别求这m个区间的区间和。