区间加

· · 个人记录

Q:给定一个数组a,执行n次操作:

a[l,r]+=k(l>=1)

求执行操作完后的数组a。

这个问题是在区间[l,r]执行“批量操作”,称为区间加

若用for循环,时间效率较低,不提倡。

A:

设函数

f(x)=a[x] (x∈N+ )......(1) f'(x)=a[x]-a[x-1] (x∈N+ )......(2)

规定a[0]=0,则(2)即某个数-前一个数。

显然,执行一次区间加后,区间内的数比区间外的数多k,这个状态起点是a[l]处,终点是a[r]处,则a[l]比a[l-1]多了k,a[r+1]比a[r]少了k,即执行每一次区间加操作等于执行下列2个操作:

f'(l)+=k f'(r+1)-=k

这样,我们通过一个数比前一个数多还是少还是不多不少,判断区间加是否开始或结束。计算完每一个f'(x)值后,就可以通过a[0]=1,a[x]=a[x-1]+f'(x),计算出a数组所有值。这个区间加的算法,时间效率高。简单说,就是:

  1. 根据l,r,k求增量函数在每一个x处的值
  2. 根据增量函数及初始值反推回原来的数组的每个值

例题:LG P1083 借教室