前缀和:
//一维:
//s[i]用来储存a[i]之前的和
s[0]=0;
for(int i=1;i<=n;i++){
s[i]=s[i-1]+a[i];
}
//二维:
//s[i][j]储存a[i][j]左上方矩形的和
s[0][0]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
s[i][j]=s[i-1][j]+s[i][j-1]+a[i][j]-s[i-1][j-1];
}
}
差分:
//一维:
//s[i]用来储存a[i]-a[i-1]
//可以通过前缀和快速得到a[i]
a[0]=0;
for(int i=1;i<=n;i++){
s[i]=a[i]-a[i-1];
}
//如果要[l,r]增加k
s[l]+=k;
s[r+1]-=k;
//最后利用前缀和得到a[]即可
//二维:
//s[i][j]储存a[i][j]
a[0][0]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
s[i][j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1];
}
}
//如果要[(x1,y1),(x2,y2)]增加k
s[x1][y1]+=k;
s[x1][y2+1]-=k;
s[x2+1][y1]-=k;
s[x2+1][y2+1]+=k;
//最后利用二维前缀和得到a[][]即可