差分数组

一、定义:对于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];

 

posted @ 2020-11-06 21:05  lihaji  阅读(145)  评论(0编辑  收藏  举报