前缀和类似于数列,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];
标签:前缀,int,sum,差分,构造,数组 From: https://www.cnblogs.com/wjt16/p/16772049.html