前缀和(1~3维)

前缀和

当遇到一个这样的情景,需要你求一个数组aaa中ala_lal​~ara_rar​,但是又不止一次询问,所以需要用O(N)O(N)O(N)的时间复杂度求出,就可以用到前缀和。

一维前缀和

顾名思义,对于数组aaa求出的一维前缀和数组sss中的第iii位表示的就是从数组aaa的第一位一直到第iii位的元素和,此时有:
si=si−1+ai s_i=s_{i-1}+a_i si​=si−1​+ai​
同时也有:
s区间和=sr−sl−1 s_{区间和}=s_r-s_{l-1} s区间和​=sr​−sl−1​
这些蒟蒻都会。

二维前缀和

这是对于一个二维的矩形块求其中一块的面积。
色盲
可以看上面这个表格,是的就是他没错了。
当我们知晓大长方形的面积,需要求小长方形\color{red}小长方形小长方形,可以看出:
S=S总−S−S−S \color{red}S=\color{black}S_总-\color{orange}S-\color{blue}S-\color{green}S S=S总​−S−S−S
但是我们不知道S\color{orange}SS和S\color{blue}SS,所以可以考虑变形:
S=S总−(S+S)−(S+S)+S \color{red}S=\color{black}S_总-(\color{orange}S+\color{green}S\color{black})-(\color{blue}S+\color{green}S\color{black})+\color{green}S S=S总​−(S+S)−(S+S)+S
虽然对色盲有些不友好
S+S\color{orange}S+\color{green}SS+S和S+S\color{blue}S+\color{green}SS+S还有S\color{green}SS我们都知道,所以S\color{red}SS也可以求出了。同理,也可以反推出S总S_总S总​。
最终有:
si,j=si−1,j+si,j−1−si−1,j−1+ai,j s_{i,j}=s_{i-1,j}+s_{i,j-1}-s_{i-1,j-1}+a_{i,j} si,j​=si−1,j​+si,j−1​−si−1,j−1​+ai,j​
推广有(区域和为顶点坐标分别为lll,rrr,qqq,ppp的矩形):
s区域和=sl,r−sq−1,r−sl,p−1+sq−1,p−1 s_{区域和}=s_{l,r}-s_{q-1,r}-s_{l,p-1}+s_{q-1,p-1} s区域和​=sl,r​−sq−1,r​−sl,p−1​+sq−1,p−1​
这个大多数人也会。
那么……

三维前缀和

对于一个立方体,从中间扣一块出来问你它的体积。
在已知前缀和的情况下,可以简化问题为:

  • 求一个立方体一个角块的体积。

在这里插入图片描述

一个正方体,如上图,六个面分别为s1…6s_{1\ldots6}s1…6​。
六面的平面图如下:
在这里插入图片描述
先删除绿色的部分。
在这里插入图片描述
在这里插入图片描述
接着删掉蓝色的部分,此时粉色的部分表示重叠部分。
在这里插入图片描述
在这里插入图片描述
再次删除黄色的部分,粉色部分表示重叠一次,紫色部分表示重叠两次。
78
在这里插入图片描述
所以,不难得知结论。
设V\color{green}VV与V\color{blue}VV的重合部分为V1\color{pink}V_1V1​,V\color{green}VV与V\color{orange}VV的重合部分为V2\color{pink}V_2V2​,V\color{orange}VV与V\color{blue}VV的重合部分为V3\color{pink}V_3V3​),三者重合为V\color{purple}VV,以立体图中为准,有:
V=V总−(V+V+V−V1−V2−V3)−V \color{red}V\color{black}=V_总-(\color{green}V\color{black}+\color{blue}V\color{black}+\color{orange}V\color{black}-\color{pink}V_1\color{black}-\color{pink}V_2\color{black}-\color{pink}V_3\color{black})-\color{purple}V V=V总​−(V+V+V−V1​−V2​−V3​)−V
化简为:
V=V总−V−V−V+V1+V2+V3−V \color{red}V\color{black}=V_总-\color{green}V\color{black}-\color{blue}V\color{black}-\color{orange}V\color{black}+\color{pink}V_1\color{black}+\color{pink}V_2\color{black}+\color{pink}V_3\color{black}-\color{purple}V V=V总​−V−V−V+V1​+V2​+V3​−V
最终得出:
Vi,j,k=Vi−1,j−1,k−1+Vi−1,j,k+Vi,j−1,k+Vi,k,k−1−Vi−1,j−1,k−Vi−1,j,k−1−Vi,j−1,k−1+ai,j,k V_{i,j,k}=V_{i-1,j-1,k-1}+V_{i-1,j,k}+V_{i,j-1,k}+V_{i,k,k-1}-V_{i-1,j-1,k}-V_{i-1,j,k-1}-V_{i,j-1,k-1}+a_{i,j,k} Vi,j,k​=Vi−1,j−1,k−1​+Vi−1,j,k​+Vi,j−1,k​+Vi,k,k−1​−Vi−1,j−1,k​−Vi−1,j,k−1​−Vi,j−1,k−1​+ai,j,k​
推广为(一个对角顶点坐标分别是iii,jjj,kkk,uuu,vvv,www):
V区块体积=Vi,j,k−Vu−1,j,k−Vi,v−1,k−Vi,j,w−1+Vu−1,v−1,k+Vu−1,j,w−1+Vi,v−1,w−1−Vu−1,v−1,w−1 V_{区块体积}=V_{i,j,k}-V_{u-1,j,k}-V_{i,v-1,k}-V_{i,j,w-1}+V_{u-1,v-1,k}+V_{u-1,j,w-1}+V_{i,v-1,w-1}-V_{u-1,v-1,w-1} V区块体积​=Vi,j,k​−Vu−1,j,k​−Vi,v−1,k​−Vi,j,w−1​+Vu−1,v−1,k​+Vu−1,j,w−1​+Vi,v−1,w−1​−Vu−1,v−1,w−1​

posted on 2025-07-02 10:41  fish2012  阅读(28)  评论(0)    收藏  举报  来源