有一个长度为n的序列a,序列中的第i个元素为ai;一个长度为m的序列b,序列中的第i个元素为bi,矩阵c是由序列a和序列b计算而得,其中ci,j=ai×bj。请你在矩阵c中找到一个矩形,这个矩形中的所有元素和小于等于x,求该矩形的最大面积。
第一行两个整数n和m,表示序列a的长度和序列b的长度。 第二行n个数,表示序列a的元素。 第三行m个数,表示序列b的元素。 第四行整数x。
一个整数,表示矩形的最大面积。
3 3
1 2 3
1 2 3
9
4
1≤n,m≤2000,1≤ai≤2000,1≤bi≤2000,1≤x≤2×109
我的40分TLE Code:
#include<bits/stdc++.h>
using namespace std;
int n,x,m,a[2010],b[2010],suma[2010],sumb[2010],ac=1,bc=1;
struct node{
int len;
int sum;
}ass[4000010],bss[4000010];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
suma[i]=suma[i-1]+a[i];
}
for(int i=1;i<=m;i++){
scanf("%d",&b[i]);
sumb[i]=sumb[i-1]+b[i];
}
scanf("%d",&x);
for(int len=n;len>=1;len--){
for(int al=1;al+len-1<=n;al++){
ass[ac].len=len;
ass[ac++].sum=suma[al+len-1]-suma[al-1];
}
}
for(int len=m;len>=1;len--){
for(int bl=1;bl+len-1<=m;bl++){
bss[bc].len=len;
bss[bc++].sum=sumb[bl+len-1]-sumb[bl-1];
}
}
int ma=-1;
for(int i=1;i<ac;i++){
for(int j=1;j<bc;j++){
if(ass[i].sum*bss[j].sum<=x){
ma=max(ma,ass[i].len*bss[j].len);
}
}
}
printf("%d",ma);
return 0;
}
求助