题目描述
你有一个n*m的01矩阵,现在询问在这其中有多少个子矩阵满足包含k个1,即和为k。
题解
这道题目是一个矩阵,我们考虑把它放到坐标系中转化为矩形。
考虑分治,计算区间 ( x 1 , x 2 , y 1 , y 2 ) (x_1,x_2,y_1,y_2) (x1,x2,y1,y2)内的答案。我们既可以按照行进行分治,也可以按照列进行分治。
因此我们采用行列交替分治的方法对矩形进行分治即可。用参数在dfs里面的状态中记录即可。
例如,上一次是行分治,这一次就列分治;上一次是列分治,这一次就行分治即可。
我们这里考虑按照行进行分治,将矩形递归分成 ( x 1 , x 2 , y 1 , m i d ) (x_1,x_2,y_1,mid) (x1,x2,y1,mid)和矩形 ( x 1 , x 2 , m i d , y 2 ) (x_1,x_2,mid,y_2) (x1,x2,mid,y2)。
相当于横着切一刀。
考虑跨越 m i d mid mid的答案。矩形的上边界需要大于 m i d mid mid,下边界需要小于 m i d mid