Count Subrectangles
首先看到数据范围\(1≤n,m≤40000\),可以知道我们根本就没有办法求出c[]
数组的每一个值,那么解决问题的关键肯定在对数组a[i],b[i]
的处理上,而对一个数组的处理无非就是求前缀和、求连续串等等,可以很容易发现,如果要形成一个矩形\((x*y)\),那么要保证有在 a 数组中要有 x 个连续的1,在 b 数组中要有 y 个连续的1,才可以。
// Created by CAD on 2020/3/8.
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=4e4+5;
int a[maxn],b[maxn];
int acnt[maxn],bcnt[maxn];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,m,k;cin>>n>>m>>k;
for(int i=1;i<=n;++i) cin>>a[i];
for(int j=1;j<=m;++j) cin>>b[j];
for(int i=1;i<=n;++i){
int cnt=0;
while(a[i]) acnt[i++]=++cnt;
}
for(int i=1;i<=m;++i){
int cnt=0;
while(b[i]) bcnt[i++]=++cnt;
}
sort(acnt+1,acnt+n+1);
sort(bcnt+1,bcnt+1+m);
ll ans=0;
for(int i=1;i*i<=k;++i){
if(i*i==k) {
ll ans1=n-(lower_bound(acnt+1,acnt+n+1,i)-acnt-1);
ll ans2=m-(lower_bound(bcnt+1,bcnt+1+m,k/i)-bcnt-1);
ans+=ans1*ans2;
}
else if(k%i==0){
ll ans1=n-(lower_bound(acnt+1,acnt+n+1,i)-acnt-1);
ll ans2=m-(lower_bound(bcnt+1,bcnt+1+m,k/i)-bcnt-1);
ans+=ans1*ans2;
ans1=n-(lower_bound(acnt+1,acnt+n+1,k/i)-acnt-1);
ans2=m-(lower_bound(bcnt+1,bcnt+1+m,i)-bcnt-1);
ans+=ans1*ans2;
}
}
cout<<ans<<"\n";
return 0;
}
CAD加油!欢迎跟我一起讨论学习算法,QQ:1401650042