差分数组
一、定义:对于n个元素的数组a,建立记录它每一项与前一项差值的差分数组d,d[i]=a[i]-a[i-1],特别的:d[0]=a[0]-0=a[0];
二、简单性质:
1.计算数列a各项的值, a[i]=d[i]的前缀和。
2.计算数列a各项的前缀和,
令数列a的第x项的前缀和为sum[x];
因为
sum[x]=∑(i=1:x)a[i];
a[i]=∑(j=1:x)d[i];
所以
sum[x]=∑(i=1:x)(x-i+1)d[i];
三、用途:
1.快速处理区间加减操作:
对数列区间[L,R]中的每个数加上x,我们通过性质(1)知道,第一个受影响的差分数组中的元素为d[L],即令d[L]+=x,那么后面数列元素在计算过程中都会加上x;
最后一个受影响的差分数组中的元素为d[R],所以令d[R+1]-=x,即可保证不会影响到R以后数列元素的计算。
这样我们不必对区间内每一个数进行处理,只需处理两个差分后的数即可;
2.询问区间和问题:
由性质(2)我们可以计算出数列各项的前缀和数组sum各项的值;那么显然,区间[L,R]的和即为ans=sum[R]-sum[L-1];