T2在洛谷自测为60pts,但计蒜客上只有25pts,我改按哪个为准
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const long long maxn=-1e18;
long long a[110000],b[110000];
long long cs[1100][1100];
long long mymin(int l,int r,int n){
long long ans=-maxn;
if(n==1){
for(int i=l;i<=r;i++){
ans=min(ans,a[i]);
}
}
else{
for(int i=l;i<=r;i++){
ans=min(ans,b[i]);
}
}
return ans;
}
long long mymax(int l,int r,int n){
long long ans=maxn;
if(n==1){
for(int i=l;i<=r;i++){
ans=max(ans,a[i]);
}
}
else{
for(int i=l;i<=r;i++){
ans=max(ans,b[i]);
}
}
return ans;
}
void dfs(int l1,int r1,int l2,int r2){
long long n1=mymin(l1,r1,1),m1=mymax(l1,r1,1);
long long n2=mymin(l2,r2,2),m2=mymax(l2,r2,2);
if(n2>=0){
cout<<n2*m1<<endl;
return;
}
else{
if(m2<=0){
if(m1<=0){
cout<<m1*m2<<endl;
return;
}
if(n1>=0){
cout<<n1*n2<<endl;
return;
}
cout<<n1*m2<<endl;
return;
}
long long cot=maxn;
for(int i=l1;i<=r1;i++){
long long amn=-maxn;
for(int j=l2;j<=r2;j++){
amn=min(amn,a[i]*b[j]);
}
cot=max(cot,amn);
}
cout<<cot<<endl;
return;
}
}
void init(int n,int m){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cs[i][j]=a[i]*b[j];
}
}
}
int main(){
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
int n,m,q;
cin>>n>>m>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
cin>>b[i];
}
if(n<=1000&&m<=1000)
init(n,m);
for(int i=1;i<=q;i++){
int l1,r1,l2,r2;
cin>>l1>>r1>>l2>>r2;
dfs(l1,r1,l2,r2);
}
return 0;
}
代码如上,提前感谢各位神犇解惑