Count Subrectangles

B - 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;
}

猜你喜欢

转载自www.cnblogs.com/CADCADCAD/p/12443124.html