https://www.luogu.com.cn/problem/P8783
hh与tt不是最远到达n吗?两层for,o(n^2),内层循环也是o(n^2),不就是o(n^4)了吗?
迷茫ing,时间复杂度不会算o(╥﹏╥)o
对于 30%的数据,N,M≤20,
对于 70%的数据,N,M≤100,
对于 100%的数据,1≤N,M≤500;0≤Aij≤1000;
1≤K≤2.5×10的八次方。
#include<iostream>
using namespace std;
const int N=1e3;
long long a[N][N],s[N][N];
long long cnt=0;
int main(){
int n,m,k;
scanf("%d %d %d",&n,&m,&k);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%lld",&a[i][j]);
}//录入数据
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
}//前缀和
}
for(int i=1; i<=m; i++){
for(int j=i; j<=m; j++){//前两个for,对所有列进行枚举
for(int tt=1,hh=1;hh<=n;hh++){
while(tt<=hh&&s[hh][j]-s[hh][i-1]-s[tt-1][j]+s[tt-1][i-1]>k)tt++;
if(tt<=hh)cnt+=hh-tt+1;
}
}
}
printf("%lld",cnt);
return 0;
}