前缀和、差分

前缀和类似于数列,s[i]=s[i-1]+a[i],    s[r]-s[l-1]等于l到r的所有项之和

 

 

求前缀和运算:

const int N = 1e5+10;
int sum[N], a[N]; //sum[i] = a[1] + a[2] + a[3] ..... a[i];
for(int i = 1; i <= n;i++)
{
sum[i] = sum[i - 1] + a[i];
}
然后查询操作:

scanf("%d%d", &l, &r);
printf("%d\n", sum[r] - sum[l - 1]);

 

差分

差分可以看出前缀和的逆运算

首先给定一个原数组a:a[1], a[2], a[3],,,,,, a[n];

然后我们构造一个数组b : b[1] ,b[2] , b[3],,,,,, b[i];

使得 a[i] = b[1] + b[2 ]+ b[3] +,,,,,, + b[i]

也就是说,a数组是b数组的前缀和数组,反过来我们把b数组叫做a数组的差分数组。换句话说,每一个a[i]都是b数组中从头开始的一段区间和。

考虑如何构造差分b数组?

最为直接的方法

如下:

a[0 ]= 0;

b[1] = a[1] - a[0];

b[2] = a[2] - a[1];

b[3] =a [3] - a[2];

........

b[n] = a[n] - a[n-1];

 

posted @ 2022-10-10 18:58  YUI唯  阅读(21)  评论(0)    收藏  举报