例如一维前缀和 差分
an 1 2 3 4 5 6
Sn 1 3 6 10 15 21
dn 1 1 1 1 1 1
1.初始化
for(int i=1;i<=n;i++)
s[i]=s[i-1]+a[i];
d[i]=a[i]-a[i-1];
2.前缀和解决区间求和
如 区间2到4的和 sum(2,4)=s[4]-s[1];
代码:int res=s[4]-s[2-1]
区间3到5的和 sum(3,5)=s[5]-s[2];
代码:int res=s[5]-s[3-1]
3.差分改值
如 区间2到4每个值都加5
区间2的dn+5,区间5的dn-5;
代码:d[2]=d[2]+5;
d[4+1]=d[4+1]-5;
for(int i=1;i<=n;i++)
s[i]=s[i-1]+d[i];
例如二维前缀和 差分
1.初始化
s[i][j]=s[i-1][j] + s[i][j-1] - s[i-1][j-1]+a[i][j];
2.区间查询
int res=s[x2][y2] - s[x1-1][y2] - s[x2][y1-1] + s[x1-1][y1-1];