首页 > 编程语言 > 详细

差分数组

时间:2020-11-06 22:47:14      阅读:29      评论:0      收藏:0      [点我收藏+]

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

 

差分数组

原文:https://www.cnblogs.com/lihahahahaji/p/13938938.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!