3617. 子矩形计数(多少个面积为k的全1子矩阵)
输入样例1:
3 3 2
1 0 1
1 1 1
输出样例1:
4
输入样例2:
3 5 4
1 1 1
1 1 1 1 1
输出样例2:
14
#include <bits/stdc++.h>
using namespace std;
#define int long long int
const int N=40005;
int n,m,T,k;
bool a[N],b[N];
int fun(bool v[],int x,int len){
int res=0;//v数组重有几个长度为x的全1子段
int cnt=0;//一段连续的1的个数 可以得到cnt-x+1个长度为x的全1子段
for(int i=1;i<=len;i++){
if(v[i])cnt++;
else{
if(cnt>=x)res+=cnt-x+1;
cnt=0;
}
}
if(cnt>=x)res+=cnt-x+1;//可能最后一串1碰不到0
return res;
}
signed main(){
cin>>n>>m>>k;//选出的数最多划分为 k组
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=m;i++)cin>>b[i];
int res=0;
for(int w=1;w<=n&&w<=k;w++){//w遍历到k是会超时的
if(k%w==0){
int h=k/w;
int x=fun(a,w,n);
int y=fun(b,h,m);
res+=x*y;//xy数量级都是N数量级的,4e4 * 4e4 过了1e9爆int
}
}
cout<<res;
return 0;
}
真的把矩阵计算出来,在矩阵里面找子矩阵必然超时
#include <bits/stdc++.h>
using namespace std;
// #define int long long int
const int N=40005;
int n,m,T,k;
int a[N],b[N],c[N][N];
signed main(){
cin>>n>>m>>k;//选出的数最多划分为 k组
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=m;i++)cin>>b[i];
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
c[i][j]=a[i]*b[j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
c[i][j]=a[i]*b[j];
}
}
大小为k
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){//左上端点
for(int w=1;w<=k&&c[i][j]&&k%w==0;w++){
int h=k/w;
if(i+w-1<=n&&j+h-1<=m){
}
}
}
}
return 0;
}