题目描述
给定一个 N×M 的矩阵 A,请你统计有多少个子矩阵 (最小 1×1,最大 N×M) 满足子矩阵中所有数的和不超过给定的整数 K?
输入格式
第一行包含三个整数 N,M 和 K。
之后 N 行每行包含 M 个整数,代表矩阵 A。
输出格式
一个整数代表答案。
数据范围
对于 30% 的数据,N,M≤20,
对于 70% 的数据,N,M≤100,
对于 100% 的数据,1≤N,M≤500;0≤Aij≤1000;1≤K≤2.5×108。
思路
①上来想到了要使用前缀和,但开始枚举的时候思路全无,遂看了下闫老师的题解,解决本题需要O(n3)的时间复杂度。
②思路仍然是使用前缀和,但是枚举的方法有所改变,先枚举上边界和下边界,设为i和j,然后再在这个上下边界内使用双指针,即一个左指针和一个右指针。可以使用双指针的原因是双指针内的值单调(所有的值都是非负数,意味着向区间内加入一个数,区间是单增的)。
③这样,在维护前缀和时,只需要维护纵向的前缀和即可。
代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 505;