import java.util.Arrays;
import java.util.Scanner;
public class Main {
static long[] lena = new long[100000];
static long[] lenb = new long[100000];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[] a = new int[n];
int[] b = new int[m];
long[] aq = new long[n+1];
long[] bq = new long[m+1];
for (int i = 1; i <= a.length; i++) {
a[i-1] = sc.nextInt();
aq[i] = aq[i-1] + a[i-1];
}
for (int i = 1; i <= b.length; i++) {
b[i-1] = sc.nextInt();
bq[i] = bq[i-1] + b[i-1];
}
int x = sc.nextInt();
Arrays.fill(lena, Integer.MAX_VALUE);
Arrays.fill(lenb, Integer.MAX_VALUE);
//记录a b数组长度为len时的最小区间和
for (int len = 1; len <= n; len ++ )
{
for (int l = 1; l <= n - len + 1; l ++ )
{
int r = l + len - 1;
lena[len] = Math.min(lena[len], aq[r] - aq[l - 1]);
}
}
for (int len = 1; len <= m; len ++) {
for (int l = 1; l <= m - len + 1; l++) {
int r = l + len -1;
lenb[len] = Math.min(lenb[len], bq[r] - bq[l - 1]);
}
}
long ans = 0;
for (int i = 1; i <= n; i++) {
int l = 1,r = m;
while(l < r) {
int mid = (l+r+1)/2;
if (check(i,mid,x)) {
l = mid;
}else {
r = mid - 1;
}
}
if(lena[i] * lenb[l] <= x) {
ans = Math.max(ans, l*i);
}
}
System.out.println(ans);
}
public static boolean check(int i ,int mid,int x) {
return lena[i]*lenb[mid] <= x;
}
}
AcWing 4395. 最大子矩阵——Java(二分+前缀和+最小区间和)
最新推荐文章于 2025-07-28 11:04:45 发布
1044

被折叠的 条评论
为什么被折叠?



