noip数据结构与算法 之 基础小算法 二维前缀和维护
相信来看二维前缀和维护的各位一定是对一维前缀和维护问题有足够的了解了,那么二维的前缀和维护实际上是在一维前缀和维护的基础上的升级,把一个数列升级成了矩阵,但是思想是一样的,具体问题如下:
问题描述:
已知n*n的矩阵a,有m次询问,每次询问给定x1,y1,x2,y2x_1,y_1,x_2,y_2x1,y1,x2,y2四个数,求以(x1,y1)(x_1,y_1)(x1,y1)为左上角坐标和(x2,y2)(x_2,y_2)(x2,y2)为右下角坐标的子矩阵的所有元素和。注意仍然包含左上角和右下角的元素。
输入数据:
第一行n和m,接下来一行有n行,每行n个数,表示矩阵a,接下来有m行,每行有四个数x1,y1,x2,y2x_1,y_1,x_2,y_2x1,y1,x2,y2,详细解释参考问题描述。
输出数据:
m行,每行一个求和解。
输入样例:
5 2
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
2 2 4 4
3 3 5 5
输出样例:
117
171
数据范围:
0<N≤1000;0<M≤1000000 \lt N \le 1000;0 \lt M \le 1000000<N≤1000;0<M≤100000
ai,ja_{i,j}ai,j是int范围内的任意整数
我们肯定能够想到,如果单纯的使用暴力解决这个问题是O(mn2)O(mn^2)O(mn2)的做法,对于这个题的数据范围是绝对超时的。所以我们也能想到是使用了一个类似于一维前缀和维护的优化方法的优化方式。但那是什么?当我们转换成为矩阵的时候,前n项和的做法就不行了。
但我们还有一个东西叫做容斥定理。容斥定理是关于集合的一个定理。这个定理是小学奥数内容,而且我们在高中课程中学习集合的时候已经了解过了,但你或许不知道这个名字。
在小学奥数中,容斥定理被描述的极其简单,如果我有n个抽屉,有m个苹果,我往抽屉里面放苹果,保证每个抽屉都有苹果的情况下,如果kn<mkn \lt mkn<m,那么必定会有一个抽屉有至少k+1个苹果。
当然,在我们学习过集合之后,容斥定理就可以这样来描述:
设有A,B,C三个集合,这三个集合相互均有交集,并且三个集合之间也有交集。则这三个集合的并集可以表示为:
A∪B∪C=A+B+C−A∩B−B∩C−A∩C+A∩B∩CA \cup B \cup C=A+B+C-A \cap B-B \cap C-A \cap C+A \cap B \cap CA∪B∪C=A+B+C−A∩B−B∩C−A∩C+A∩B∩C