AcWing 3617. 子矩形计数
原题链接
中等
作者:
追梦少年ML
,
2021-06-02 23:43:17
,
所有人可见
,
阅读 355
首先分解k,找到a*b==k的所有a、b
然后在A中找出连续有a个1的个数,在B中找出连续有b个1的个数
二者所得的数相乘即为所求。
为什么这么求是对的呢?关键是二者相乘的所得的矩阵是怎么来的。
A中有联系a个1,B中有联系b个1,那么二者相乘的矩阵就有个对于的a*b个全1 的子矩阵。
(不信的话,在草纸上算一下二个向量相乘所得矩阵的形成过程。
#include<bits/stdc++.h>
using namespace std;
long long count(vector<int> ve,int n){
int i,cnt=0;
long long res=0;
for(i=0;i<ve.size();i++){
if(ve[i]==1) cnt++;
else{
if(cnt>=n) res+=cnt-n+1;
cnt=0;
}
}
if(cnt>=n) res+=cnt-n+1;
return res;
}
int main(){
int i,m,n,k;
long long res=0;
cin>>m>>n>>k;
vector<int> A(m),B(n);
for(i=0;i<m;i++) cin>>A[i];
for(i=0;i<n;i++) cin>>B[i];
for(i=1;i<=k&&i<=m;i++){
if(k%i==0){
int a=i,b=k/i;
res+=count(A,a)*count(B,b);
}
}
cout<<res<<endl;
return 0;
}