设s[]为前缀和数组,a[]为差分数组
初始化
一维的
两个都是用的同一个公式,用的都是同样的变量
循环中的
a[i]=s[i]-s[i-1] (这种还是用公式的insert算了)
void insert(int l, int r, int c)
{
b[l] += c;
b[r + 1] -= c;
}
for (int i = 1; i <= n; i ++ ) insert(i, i, s[i]);
s[i]=s[i-1]+a[i]
只用a[]
a[i]+=a[i-1]---->s[i]
二维的
两个都是用的同一个公式,用的都是同样的变量
初始化前缀和数组只用a[],直接将a[]换成s[]
循环中的
当前坐标的值=当前坐标的值(只有这个当前是a[],其他的在这个公式里面都已经向s[]转化过了)+当前坐标(x-1)的值+当前坐标(y-1)的值-当前坐标(x-1,y-1)的值
初始化差分数组
用公式的insert算了
void insert(int x1, int y1, int x2, int y2, int c)
{
a[x1][y1] += c;
a[x2 + 1][y1] -= c;
a[x1][y2 + 1] -= c;
a[x2 + 1][y2 + 1] += c;
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
insert(i, j, i, j, s[i][j]); //构建差分数组
}
}
公式
//一维的简单不谈了,这里只理解二维的
前缀和公式(求区间差分的和)只用s[]
右下角坐标的值-左上坐标(x-1)的值-左上坐标(y-1)的值+左上坐标(x-1,y-1)的值
差分公式(让区间前缀和+常数)只用a[]
左上坐标的值+c,
右下坐标(x+1)的值-c,
右下坐标(y+1)的值-c,
右下坐标(x+1,y+1)的值+c
//公式部分,你形象记一下就好了,它们的操作都是不需要用容器来装的
//初始化部分,一般需要用容器装结果,因为得到的是要处理的东西
//但是一般做法是先初始化,再公式处理完,又要通过初始化得到结果,这个时候就可以不用容器装了
//或者说不用新的容器装了,直接可以自己更新自己来打印
notice
for(int i=1;i<=alls.size();i++){
s[i]=s[i-1]+a[i];
}
//这里应该<=alls.size()的,我错写成了<,前缀和差分都是1开始,最后<=总长度的