解释res += r - l + 1
每次累加左边界和右边界之间有多少个元素
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 510;
int s[N][N], k, n, m;
int main(){
cin>>n>>m>>k;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
scanf("%d", &s[i][j]), s[i][j] += s[i-1][j];//求每一列的前缀和
LL res=0;
for(int i=1; i<=n; i++){//上边界i
for(int j=i; j<=n; j++){//下边界j
for(int l=1, r=1, sum=0; r<=m; r++){//二分
sum += s[j][r] - s[i-1][r];
while(l<=r && sum>k){
sum -= s[j][l] - s[i-1][l];
l++;
}
res += r - l + 1;
}
}
}
cout<<res<<endl;
return 0;
}