有一个疑惑,题目中明确说到了 n,m≤105 ,因此我就开了 105 的空间,可是 60pts RE ,然后开到 1e6 就过了,有无好心人解答一下/kel
code
#include<bits/stdc++.h>
#define int long long
#define ll long long
#define next nxt
#define re register
#define il inline
const int N = 1e5 +5;//1e5 60pts , 1e6 100pts
const int INF = 1e9 + 5;
using namespace std;
int max(int x,int y){return x > y ? x : y;}
int min(int x,int y){return x < y ? x : y;}
int lg[N],a[N],b[N],n,m,q,l1,r1,l2,r2;
int MaxPosA[N][23] , MinPosA[N][23] , MaxNegA[N][23] , MinNegA[N][23];
int MaxPosB[N][23] , MinPosB[N][23] , MaxNegB[N][23] , MinNegB[N][23];
il int read()
{
int f=0,s=0;
char ch=getchar();
for(;!isdigit(ch);ch=getchar()) f |= (ch=='-');
for(; isdigit(ch);ch=getchar()) s = (s<<1) + (s<<3) + (ch^48);
return f ? -s : s;
}
il void init()
{
for(re int j=1;j<=lg[n];j++)
for(re int i=1;i<=n;i++)
{
MaxPosA[i][j] = max(MaxPosA[i][j-1],MaxPosA[i+(1<<(j-1))][j-1]);
MinPosA[i][j] = min(MinPosA[i][j-1],MinPosA[i+(1<<(j-1))][j-1]);
MaxNegA[i][j] = max(MaxNegA[i][j-1],MaxNegA[i+(1<<(j-1))][j-1]);
MinNegA[i][j] = min(MinNegA[i][j-1],MinNegA[i+(1<<(j-1))][j-1]);
}
for(re int j=1;j<=lg[m];j++)
for(re int i=1;i<=m;i++)
{
MaxPosB[i][j] = max(MaxPosB[i][j-1],MaxPosB[i+(1<<(j-1))][j-1]);
MinPosB[i][j] = min(MinPosB[i][j-1],MinPosB[i+(1<<(j-1))][j-1]);
MaxNegB[i][j] = max(MaxNegB[i][j-1],MaxNegB[i+(1<<(j-1))][j-1]);
MinNegB[i][j] = min(MinNegB[i][j-1],MinNegB[i+(1<<(j-1))][j-1]);
}
}
signed main()
{
n = read() , m = read() , q = read();
lg[1] = 0;
for(re int i=2;i<=max(n,m);i++) lg[i] = lg[i>>1] + 1;
for(re int i=1;i<=n;i++)
{
a[i] = read();
if(a[i]>=0)
MaxPosA[i][0]=MinPosA[i][0]=a[i],MaxNegA[i][0]=-INF,MinNegA[i][0]=INF;
else
MaxNegA[i][0]=MinNegA[i][0]=a[i],MaxPosA[i][0]=-INF,MinPosA[i][0]=INF;
}
for(re int i=1;i<=m;i++)
{
b[i] = read();
if(b[i]>=0)
MaxPosB[i][0]=MinPosB[i][0]=b[i],MaxNegB[i][0]=-INF,MinNegB[i][0]=INF;
else
MaxNegB[i][0]=MinNegB[i][0]=b[i],MaxPosB[i][0]=-INF,MinPosB[i][0]=INF;
}
init();
while(q--)
{
l1 = read() , r1 = read() , l2 = read() , r2 = read();
int A[5],B[5],Lg = lg[r1-l1+1];
int l = l1 , r = r1;
A[1] = max(MaxPosA[l][Lg],MaxPosA[r-(1<<Lg)+1][Lg]);A[2] = min(MinPosA[l][Lg],MinPosA[r-(1<<Lg)+1][Lg]);
A[3] = max(MaxNegA[l][Lg],MaxNegA[r-(1<<Lg)+1][Lg]);A[4] = min(MinNegA[l][Lg],MinNegA[r-(1<<Lg)+1][Lg]);
l = l2 , r = r2 , Lg = lg[r2-l2+1];
B[1] = max(MaxPosB[l][Lg],MaxPosB[r-(1<<Lg)+1][Lg]);B[2] = min(MinPosB[l][Lg],MinPosB[r-(1<<Lg)+1][Lg]);
B[3] = max(MaxNegB[l][Lg],MaxNegB[r-(1<<Lg)+1][Lg]);B[4] = min(MinNegB[l][Lg],MinNegB[r-(1<<Lg)+1][Lg]);
int ans = -1e18 - 1;
for(re int i=1;i<=4;i++)
{
if(abs(A[i]) == INF) continue;
int sum = 1e18;
for(re int j=1;j<=4;j++)
{
if(abs(B[j]) == INF) continue;
sum = min(sum,A[i]*B[j]);
}
ans = max(ans,sum);
}
cout << ans << "\n";
}
return 0;
}