Codeforces Round #626 Div. 2 B. Count Subrectangles

Codeforces Round #626 Div. 2 B. Count Subrectangles_第1张图片
给出数组a和数组b
数组c是由a和b决定的 c[i][j]==a[i]b[j]
所以我们画几个例子就能发现 如果a[i]为)那么这一行全为0 B[i]为0
那么这一列全为0
让你求出区域块面积为k且全由1组成的区域个数
题意很简单
a数组里面连续的1有多长储存起来 再储存b里面连续的一的长度
我们直接枚举组成k的所有情况
1
k 2k/2 3k/3
对于每种情况 我们去求出这种情况所有的个数即可
注意特判r*r=k的情况

ll fun(ll r,ll c)
{
    ll cnt=0;
    ll rr=0,cc=0;
    rep(i,1,n)
    {
        if(a[i]==0)
            cnt=0;
        else
            cnt++;
        if(cnt>=r)
            rr++;
    }
    cnt=0;
    rep(i,1,m)
    {
        if(b[i]==0)
            cnt=0;
        else
            cnt++;
        if(cnt>=c)
            cc++;
    }
    return rr*cc;
}
void solve()
{
    n=read(),m=read(),k=read();
    rep(i,1,n)
    {
        a[i]=read();
    }
    rep(i,1,m)
    {
        b[i]=read();
    }
    ll ans=0;
    for(int i=1;i*i<=k;i++)
        if(k%i==0)
        {
            if(i*i==k)
                ans+=fun(i,i);
            else
                ans+=fun(i,k/i)+fun(k/i,i);
        }
    cout<

你可能感兴趣的:(codeforce)