考前复习——差分、前缀和

发布时间 2023-06-13 17:24:46作者: pig_pig

前缀和

前缀和可以简单理解为「数列的前 n 项的和」

对于一维前缀和 简单的处理方式为b[i]=b[i-1]+a[i]

对于二维前缀和

sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j]

访问任意矩阵前缀和为

sum[l2][r2]-sum[l1-1][r2]-sum[l2][r1-1]+sum[l1-1][r1-1]

差分

差分是一种和前缀和相对的策略,可以当做是求和的逆运算。

它可以维护多次对序列的一个区间加上一个数,并在最后询问某一位的数或是多次询问某一位的数。

区间修改,单点查询

差分使

b[1]=a[1] for(int i=2;i<=n;i++) b[i]=a[i]-a[i-1]

这样 a[i]的值即为b[i]的前缀和
即 a[n]=sum(b[1~n])

a[i]的前缀和也可以用差分数组求出

for k=i k<=n k++: sum+=(n-i+1)*b[k]

使用差分数组时 若使[l,r]区间都加上k 那么b[l]+=k , b[r+1]-=k即可