当一个人类定义了一个这样的数组:
int a[M][M][M][M];
当一个人类又得到了两根木棍……
容斥原理
两根木棍如下摆放:
长度分别为 444,777,中间重叠了 222,总长本应该是 4+7=114+7=114+7=11,但是由于中间的重叠,所以总长是 11−2=911-2=911−2=9。
紧接着我们充分发挥人类智慧,两个集合 AAA 和 BBB,有
A∪B=A+B−A∩B
A\cup B=A+B-A\cap B
A∪B=A+B−A∩B
对于三个集合 AAA、BBB、CCC,有
A∪B∪C=A+B+C−A∩B−A∩C−B∩C+A∩B∩C
A\cup B\cup C=A+B+C-A\cap B-A\cap C-B\cap C+A\cap B\cap C
A∪B∪C=A+B+C−A∩B−A∩C−B∩C+A∩B∩C
注意到这里的三集合交集被前面减去两两交集时多减了一次,所以应该加回来。
到这里,可以发现,求多个集合的并集,应该先加上所有集合,再减去相加时重复的,再加上减去时重复的,再减去加上时重复的……
所以……
四维前缀和
根据容斥原理,很好得出四维前缀和的推导公式。
求多个集合的并集,应该先加上所有集合,再减去相加时重复的,再加上减去时重复的,再减去加上时重复的……
四维数组 SSS 中,Si−1,j,k,lS_{i-1,j,k,l}Si−1,j,k,l 与 Si,j−1,k,lS_{i,j-1,k,l}Si,j−1,k,l 的重叠部分是Si−1,j−1,k,lS_{i-1,j-1,k,l}Si−1,j−1,k,l,剩余同理,接着,Si−1,j−1,k,lS_{i-1,j-1,k,l}Si−1,j−1,k,l 与 Si,j−1,k−1,lS_{i,j-1,k-1,l}Si,j−1,k−1,l 的重叠部分是 Si−1,j−1,k−1,lS_{i-1,j-1,k-1,l}Si−1,j−1,k−1,l,最后,Si−,j−1,k−1,lS_{i-,j-1,k-1,l}Si−,j−1,k−1,l 与 Si−1,j−1,k,l−1S_{i-1,j-1,k,l-1}Si−1,j−1,k,l−1 的重叠部分是Si−1,j−1,k−1,l−1S_{i-1,j-1,k-1,l-1}Si−1,j−1,k−1,l−1
so……
Si,j,k,l=ai,j,k,l+Si−1,j,k,l+Si,j−1,k,l+Si,j,k−1,l+Si,j,k,l−1−Si−1,j−1,k,l−Si−1,j,k−1,l−Si−1,j,k,l−1−Si,j−1,k−1,l−Si,j−1,k,l−1−Si,j,k−1,l−1+Si−1,j−1,k−1,l+Si−1,j−1,k,l−1+Si−1,j,k−1,l−1+Si,j−1,k−1,l−1−Si−1,j−1,k−1,l−1
S_{i,j,k,l}=a_{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-1,k,l-1}\\+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}
Si,j,k,l=ai,j,k,l+Si−1,j,k,l+Si,j−1,k,l+Si,j,k−1,l+Si,j,k,l−1−Si−1,j−1,k,l−Si−1,j,k−1,l−Si−1,j,k,l−1−Si,j−1,k−1,l−Si,j−1,k,l−1−Si,j,k−1,l−1+Si−1,j−1,k−1,l+Si−1,j−1,k,l−1+Si−1,j,k−1,l−1+Si,j−1,k−1,l−1−Si−1,j−1,k−1,l−1
区间求和的公式可以逆推。
同理,剩下的 NNN 维前缀和也可以这样推出。