站外题求助
  • 板块题目总版
  • 楼主BNCDBD
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/8/25 10:56
  • 上次更新2024/8/25 13:56:11
查看原帖
站外题求助
1357674
BNCDBD楼主2024/8/25 10:56

题目描述

有一个长度为nn的序列aa,序列中的第ii个元素为aia_i;一个长度为mm的序列bb,序列中的第ii个元素为bib_i,矩阵cc是由序列aa和序列bb计算而得,其中ci,j=ai×bjc_{i,j}=a_i\times b_j。请你在矩阵cc中找到一个矩形,这个矩形中的所有元素和小于等于xx,求该矩形的最大面积。

输入格式

第一行两个整数nn和mm,表示序列aa的长度和序列bb的长度。 第二行nn个数,表示序列aa的元素。 第三行mm个数,表示序列bb的元素。 第四行整数xx。

输出格式

一个整数,表示矩形的最大面积。

样例

输入数据1

3 3
1 2 3
1 2 3
9

输出数据1

4

数据范围

1≤n,m≤2000,1≤ai≤2000,1≤bi≤2000,1≤x≤2×1091\le n,m\le 2000,1\le a_i\le 2000,1\le b_i\le 2000,1\le x\le 2\times 10^9

我的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;
}

求助

2024/8/25 10:56
加载中...