N 开到 1000 能过60的点,在InfOJ上 C++14 10000正常跑,并且空间在10000Kb 以内。
用C++ 98 后在洛谷AC。
以尝试过define int long long 并且把重定义的max,min删去。
下面是CE代码。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define max(a,b) ((a)>(b)?(a):(b));
#define min(a,b) ((a)<(b)?(a):(b));
using namespace std;
inline int read(){
register int x = 0, f = 1; register char ch = getchar();
for(; ch > '9' || ch < '0'; ch = getchar()) if(ch == '-') f = -1;
for(; ch >= '0' && ch <= '9'; ch = getchar()) x = (x << 1) + (x << 3) + (ch ^ '0');
return x * f;
}
const int N = 1e5 + 10;
int n, m, T;
long long mxza, mxfa, mifa, miza;
long long mxb, mib;
long long ans;
struct node{
int mxz = -1, miz = 2e9, mxf = -2e9, mif = 1;
}ta[N << 2];
struct Node{
int mx = -2e9, mi = 2e9;
}tb[N << 2];
void pushupa(int now){
int ls = (now << 1);
int rs = (now << 1) | 1;
ta[now].mxz = max(ta[ls].mxz,ta[rs].mxz);
ta[now].miz = min(ta[ls].miz,ta[rs].miz);
ta[now].mxf = max(ta[ls].mxf,ta[rs].mxf);
ta[now].mif = min(ta[ls].mif,ta[rs].mif);
}
void inserta(int val, int now, int l, int L, int R){
if(L == R){
if(val >= 0) ta[now].mxz = ta[now].miz = val;
else ta[now].mif = ta[now].mxf = val;
return;
}
int mid = (L + R) >> 1;
if(mid >= l) inserta(val, now << 1, l, L, mid);
else inserta(val, (now << 1) | 1, l, mid + 1, R);
pushupa(now);
}
inline void pushupb(int now){
int ls = (now << 1);
int rs = (now << 1) | 1;
tb[now].mx = max(tb[ls].mx,tb[rs].mx);
tb[now].mi = min(tb[ls].mi,tb[rs].mi);
}
void insertb(int val, int now, int l, int L, int R){
if(L == R){
tb[now].mx = tb[now].mi = val;
return;
}
int mid = (L + R) >> 1;
if(mid >= l) insertb(val, now << 1, l, L, mid);
else insertb(val, (now << 1) | 1, l, mid + 1, R);
pushupb(now);
}
void querya(int now, int l, int r, int L, int R){
if(l >= L && r <= R){
mxza = max(mxza,ta[now].mxz);
mxfa = max(mxfa,ta[now].mxf);
miza = min(miza,ta[now].miz);
mifa = min(mifa,ta[now].mif);
return;
}
int mid = (l + r) >> 1;
if(mid >= L) querya(now << 1, l, mid, L, R);
if(mid < R) querya((now << 1) | 1, mid + 1, r, L, R);
}
void queryb(int now, int l, int r, int L, int R){
if(l >= L && r <= R){
mxb = max(mxb,tb[now].mx);
mib = min(mib,tb[now].mi);
return;
}
int mid = (l + r) >> 1;
if(mid >= L) queryb(now << 1, l, mid, L, R);
if(mid < R) queryb((now << 1) | 1, mid + 1, r, L, R);
}
int main(){
n = read(); m = read(); T = read();
for(int i = 1; i <= n; ++ i){
inserta(read(), 1, i, 1, n);
}
for(int i = 1; i <= m; ++ i){
insertb(read(), 1, i, 1, m);
}
while(T --){
mxza = -1, mxfa = -2e9, miza = 2e9, mifa = 1;
mxb = -2e9; mib = 2e9;
ans = -9e18;
int l1 = read(), r1 = read(), l2 = read(), r2 = read();
querya(1, 1, n, l1, r1);
queryb(1, 1, m, l2, r2);
if(mxb < 0){
if(mifa < 0) ans = mifa * mxb;
else ans = mib * miza;
}
else if(mib >= 0){
if(mxza >= 0) ans = mib * mxza;
else ans = mxb * mxfa;
}
else{
if(miza != 2e9){
ans = max(ans,miza*mib);
}
if(mxfa != -2e9){
ans = max(ans,mxfa*mxb);
}
}
printf("%lld\n", ans);
}
}