一维的前缀和加双指针
r - l + 1 为什么是所有的结果,因为双指针,它存的时候,是原来的单个矩阵加后来的单个矩阵和合并矩阵
比如说,1 + 2 , 就是第一列和第二列的res结果,当左右指针是1 2 的时候,1 + 2 包括了3,就是第一列和第二列合并的矩阵
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std ;
typedef long long LL ;
const int N = 510;
int n , m , k ;
int s[N][N] ;
int main()
{
cin >> n >> m >> k ;
for(int i = 1 ; i <= n ; i++)
{
for(int j = 1 ; j<= m ; j++)
{
cin >> s[i][j] ;
s[i][j] += s[i-1][j] ;
}
}
LL res = 0;
for(int i = 1; i <=n ; i++)
for(int j = i ; j<= n ; j++)
for(int l = 1, r = 1 ,sum = 0 ; r <= m ; r++)
{
sum += s[j][r] - s[i - 1][r] ;
while(sum > k)
{
sum -= s[j][l] - s[i-1][l] ;
l++ ;
}
res += r - l + 1 ;
}
cout << res ;
return 0 ;
}