最小矩阵和

给你 2 个数组 a,b,a 数组有 n 个数,b 数组有 m 个数, (1<=n,m<=2000,1<=ai,bi<=2000),c 是一个 n*m 的矩阵,c 的第 i 行第 j 列元素为 ai*bj。 现 在 让 你 找 一 个 子 矩 阵 , 该 子 矩 阵 的元素和小于等 于 x(1<=x<=2*10^9),但是要使得该子矩阵面积尽量大。

(注意!元素和与面积不是一个东西)

Input

第一行包含 2 个整数 n,m(1<=n,m<=2000),代表 a 数组和 b 数组的大小。

第二行 n 个数,代表数组 a 的元素(1<=ai<=2000)。

第三行 m 个数,代表数组 b 的元素(1<=bi<=2000)。

第四行 x(1<=x<=2*10^9)

Output

输出最大的符合条件的矩阵的面积。

Examples

Input

3 3

1 2 3

1 2 3

9

Output

4

Input

5 1

5 4 2 4 5

2

5

Output

1

#include<iostream>

using namespace std;

typedef long long ll;//定义long long为ll

const ll inf=0x3f3f3f3f; //最大值

const int N=2e3+10;

ll a[N],b[N],sa[N],sb[N],ma[N],mb[N];

int main(){

int n,m;cin>>n>>m;

for(int i=0;i<=n;i++)ma[i]=inf;

for(int i=0;i<=m;i++)mb[i]=inf;

for(int i=1;i<=n;i++)cin>>a[i];

for(int i=1;i<=m;i++)cin>>b[i];

ll x;cin>>x;

for(int i=1;i<=n;i++)sa[i]=sa[i-1]+a[i];

for(int i=1;i<=m;i++)sb[i]=sb[i-1]+b[i];

for(int i=1;i<=n;i++){

for(int j=i;j<=n;j++)//行元素和

ma[j-i+1]=min(ma[j-i+1],sa[j]-sa[i-1]);

}

for(int i=1;i<=m;i++){//列元素和

for(int j=i;j<=m;j++)

mb[j-i+1]=min(mb[j-i+1],sb[j]-sb[i-1]);

}

//列元素和*行元素和==该矩阵元素和

int ans=0;

for(int i=1;i<=n;i++){

for(int j=1;j<=m;j++){

if(ma[i]*mb[j]<=x) // 不超过x

ans=max(ans,i*j);//取最大

}

}

cout<<ans<<endl;

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值