前缀和问题再探究

普通的前缀和
一种用于解决仅有询问的区间和查询问题的数据结构。
形如:给定一个数列,
通过在线性时间内预处理出从
前缀和不仅可以存储“和”的形式,还可以存储一切具有可加性的东西。比如最值,但需要注意的是,如果存储的东西不具有可减性,那么就不能通过
至于为什么要提这个,在高维前缀和中,我们可能不需要维护减操作,这类仅具有可加性的操作就有意义了。
高维前缀和
二维前缀和
一般来说,我们求二维前缀和会使用容斥原理。
设
那么有递推式:
同样的,如果我们想求出某一个矩阵的和,比如
也可以使用容斥原理,答案为:
注意到,虽然看上去二维前缀和只是带了一个
就是 DP。
我们对于每一个维度分别进行递推,还是以二维为例,我们先对第一维进行 DP,相当于做一次一维前缀和:
初始每一个
此时有
这时我们再对第二维做一次 DP:
注意到,
和原来的
n 维前缀和
其实有了上面的铺垫,
我们分别对每一维做一次 DP,每一次 DP 枚举整个高维空间的点,时间复杂度为
至于正确性,可以和
但是的话,维数高了数组会显得很乏力,我们需要一种特殊的形式,比如用状压。
常见的高维前缀和技巧有按二进制位状压,按质因数分解状压等。
时间复杂度一般可以把暴力的一个