算法笔记-差分和前缀和
差分
就是将数列中的每一项分别与前一项数做差,例如:
一个序列1 2 5 4 7 3,差分后得到1 1 3 -1 3 -4 -3
差分求前缀和=原序列
将原序列区间[L,R]中的元素全部+1,可以转化操作为差分序列L处+1,R+1处-1
二维情况可视作多个一维;
for(int i=1;i<=m;i++){
cin>>x1>>y1>>x2>>y2;
for(int j=x1;j<=x2;j++){
a[j][y1]+=1;
a[j][y2+1]-=1;
}
}
前缀和
一维前缀和:每一项+=前一项
二维前缀和:点(i,j)到原点这个矩阵所有元素的和;
二维前缀和的求法 : f[i][j]=f[i−1][j]+f[i][j−1]−f[i−1][j−1]+a[i][j];
求子矩阵的前缀和;
for(register int i = 1;i <= k;++ i)
{
int x1,x2,y1,y2;//x1,y1是左上角的坐标,另一对是右下角的坐标
cin >> x1 >> y1 >> x2 >> y2;
cout << f[x2][y2] - f[x1 - 1][y2] - f[x2][y1 - 1] + f[x1 - 1][y1 - 1];
}