数据结构-高维差分
前置知识
思路
在《【数据结构】差分》里,我们知道了差分是个好东西。
如果说,一维的差分不够用了,怎么办?
天空一声巨响,高维差分闪亮登场
先从二维数组谈起。
给定一个二维数组
a
a
a,要对其差分,即要求
Δ
2
a
\Delta^2a
Δ2a。
不难从高维前缀和出发,想到高维差分的解法:做两次差分。
即先求
Δ
a
\Delta a
Δa,再求
Δ
2
a
=
Δ
(
Δ
a
)
\Delta^2a=\Delta(\Delta a)
Δ2a=Δ(Δa)
数据结构参数
设 S S S 为高维数组大小
- 时间复杂度: Θ ( S ) \Theta(S) Θ(S)
- 空间复杂度: Θ ( S ) \Theta(S) Θ(S)
实现代码
for (int i=1;i<=n;i++)
for (int i=1;i<=m;i++)
cin>>a[i][j];
for (int i=1;i<=n;i++)
for (int i=1;i<=m;i++)
tmp[i][j]=a[i][j]-a[i-1][j];
for (int i=1;i<=n;i++)
for (int i=1;i<=m;i++)
d[i][j]=tmp[i][j]-tmp[i][j-1];
for (int i=1;i<=m;i++){
cin>>l>>r>>h>>t>>x;
d[h][l]+=x;
d[h][r+1]-=x;
d[t+1][l]-=x;
d[t+1][r+1]+=x;
}
for (int i=1;i<=n;i++)
for (int i=1;i<=m;i++)
tmp[i][j]=tmp[i-1][j]+d[i][j];
for (int i=1;i<=n;i++)
for (int i=1;i<=m;i++)
a[i][j]=a[i][j-1]+tmp[i][j];
for (int i=1;i<=q;i++){
cin>>x>>y;
cout<<a[x][y];
}
练习
似乎找不到练习