Codeforces Round #513 C - Maximum Subrectangle (数学+思维)

Posted fy1999

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #513 C - Maximum Subrectangle (数学+思维)相关的知识,希望对你有一定的参考价值。

已知一个长度为n的数组a和一个长度为m的数组b,问当两者相乘组成矩阵时求满足子矩阵中所有数相加小于x的最大面积

数学题,这个问题可以转化为从A和B中找到一个子阵列,使得这些子阵列的元素总和的乘积小于或等于x,并且它们的大小的乘积是最大的

 

#include <bits/stdc++.h>
#define ll long long

using namespace std;

const int maxn=2000+10;

ll a[maxn],b[maxn],minsa[maxn],minsb[maxn];
ll n,m,x;

int main()
{
    ios::sync_with_stdio(false);cin.tie(0);
    cin>>n>>m;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    for(int i=0;i<m;i++){
        cin>>b[i];
    }
    cin>>x;
    for(int i=0;i<maxn;i++)
        minsa[i]=minsb[i]=x+1;

    for(int i=0;i<n;i++)
    {
        ll sum=0;
        for(int j=i;j<n;j++)
        {
            sum+=a[j];
            minsa[j-i+1]=min(minsa[j-i+1],sum);

        }
    }
    for(int i=0;i<m;i++)
    {
        ll sum=0;
        for(int j=i;j<m;j++)
        {
            sum+=b[j];
            minsb[j-i+1]=min(minsb[j-i+1],sum);
        }
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++){
            if(minsa[i]*minsb[j]<=x) ans=max(ans,i*j);
        }
    }
    cout<<ans<<endl;
    return 0;
}

 

以上是关于Codeforces Round #513 C - Maximum Subrectangle (数学+思维)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #513 by Barcelona Bootcamp (rated, Div. 1 + Div. 2) C D

Codeforces Round #513 by Barcelona Bootcamp (rated, Div. 1 + Div. 2)

Codeforces Round #513 游记

[Codeforces Round #513 by Barcelona Bootcamp (rated, Div. 1 + Div. 2) ](A~E)

Codeforces Round #513-ABCD

Codeforces Round #513(Div.1+Div.2)