算法筆記-差分和前綴和
差分
就是將數列中的每一項分別與前一項數做差,例如:
一個序列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];
}