前言
我在全网搜索,发现没有一篇帖子涉及到四维及以上的前缀和,于是我在冥思苦想之后,根据数学+找规律总结出高维前缀和的公式。
思路
为了找规律,我们来看低维前缀和的公式。
一维
//预处理
s[i]=s[i-1]+a[i];
//求部分和
sum[l~r]=s[r]-s[l-1];
二维
s[i][j]=s[i-1][j]
+s[i][j-1]
-s[i-1][j-1]
+a[i][j];
sum[l1~r1][l2~r2]=s[r1][r2]
-s[r1][l2-1]
-s[l1-1][r2]
+s[l1-1][l2-1];
三维
s[i][j][k]=s[i-1][j][k]
+s[i][j-1][k]
+s[i][j][k-1]
-s[i-1][j-1][k]
-s[i-1][j][k-1]
-s[i][j-1][k-1]
+s[i-1][j-1][k-1]
+a[i][j][k];
sum[l1~r1][l2~r2][l3~r3]=s[r1][r2][r3]
-s[r1][r2][l3-1]
-s[r1][l2-1][l3]
-s[l1-1][r2][r3]
+s[l1-1][l2-1][r3]
+s[l1-1][r2][l3-1]
+s[r1][l2-1][l3-1]
-s[l1-1][l2-1][l3-1];
四维
到四维我们发现有些不对起来了,因为我们所处的世界是三维的,理解不了高维的东西,但我们可以进行类比研究。
预处理
以三维来举例我们可以发现,s[i][j][k]轮流加上s[i-1][j][k],s[i][j-1][k],s[i][j][k-1],仔细研究可以加上的是只有一维进行更改的。
然后s[i][j][k]又开始减去s[i-1][j-1][k],s[i-1][j][k-1],s[i][j-1][k-1],这些东西只改变了两个维度。
最后s[i][j][k]又开始加上s[i-1][j-1][k-1],改变了三个维度
大家可否发现什么,没错,只改变奇数个维度的数被加上,只改变偶数个维度的数被减去。
因此,根据上述猜想可以写出:
s[i][j][k][l]=s[i-1][j][k][l]
+s[i][j-1][k][l]
+s[i][j][k-1][l]
+s[i][j][k][l-1]
-s[i-1][j-1][k][l]
-s[i-1][j][k-1][l]
-s[i-1][j][k][l-1]
-s[i][j-1][k-1][l]
-s[i][j-1][k][l-1]
-s[i][j][k-1][l-1]
+s[i-1][j-1][k-1][l]
+s[i-1][j][k-1][l-1]
+s[i][j-1][k-1][l-1]
-s[i-1][j-1][k-1][l-1]
+a[i][j][k][l];
求解
如果是求sum[l1~r1][l2 ~r2][l3 ~r3][l4 ~r4]呢?
还是类比,这次我不在细讲,直接给结论
每次只有l的维度(如:l1,l2,l3,l4)会被更改,其他的根预处理正好相反,奇数次会被减去,偶数次会被增加
sum[l1~r1][l2~r2][l3~r3][l4~r4]=s[r1][r2][r3][r4]
+s[l1-1][r2][r3][r4]
-s[r1][l2-1][r3][r4]
-s[r1][r2][l3-1][r4]
+s[r1][r2][r3][l4-1]
+s[l1-1][l2-1][r3][r4]
+s[l1-1][r2][l3-1][r4]
+s[l1-1][r2][r3][l4-1]
+s[r1][l2-1][l3-1][r4]
+s[r1][l2-1][r3][l4-1]
+s[r1][r2][l3-1][l4-1]
-s[l1-1][l2-1][l3-1][r4]
-s[l1-1][r2][l3-1][l4-1]
-s[r1][l2-1][l3-1][l4-1]
+s[l1-1][l2-1][l3-1][l4-1];
更高维
更高维的前缀和的规律和上述一致
总结
这样,我们就研究出高维前缀和的公式
预处理
只改变奇数个维度的数被加上,只改变偶数个维度的数被减去。
求解
每次只有l的维度(如:l1,l2,l3,l4)会被更改,其他的根预处理正好相反,奇数次会被减去,偶数次会被增加