代码1
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
struct node{
int maz,miz,maf,mif,zero;
}wa[N*4],wb[N*4];
int a[N],b[N];
int n,m,q;
node pushup(node lc,node rc){
node res;
if(lc.maz&&rc.maz){
res.maz = max(lc.maz,rc.maz);
res.miz = min(lc.miz,rc.miz);
}else{
res.maz = lc.maz+rc.maz;
res.miz = lc.miz+rc.miz;
}
if(lc.maf&&rc.maf){
res.maf = max(lc.maf,rc.maf);
res.miz = min(lc.mif,rc.mif);
}else{
res.maf = lc.maf+rc.maf;
res.mif = lc.mif+rc.mif;
}
res.zero = lc.zero||rc.zero;
return res;
}
void build(int k,int l,int r,node tr[],int e[]){
if(l==r){
if(e[l]>0){
tr[k].maz = tr[k].miz = e[l];
}else if(e[l]<0){
tr[k].maf = tr[k].mif = e[l];
}else{
tr[k].zero = 1;
}
return;
}
int mid = l+r>>1;
build(k<<1,l,mid,tr,e);
build(k<<1|1,mid+1,r,tr,e);
tr[k] = pushup(tr[k<<1],tr[k<<1|1]);
}
node query(int k,int l,int r,int x,int y,node tr[]){
if(l>=x&&r<=y){
return tr[k];
}
int mid = l+r>>1;
if(x>mid)return query(k<<1|1,mid+1,r,x,y,tr);
if(y<=mid)return query(k<<1,l,mid,x,y,tr);
return pushup(query(k<<1,l,mid,x,y,tr),query(k<<1|1,mid+1,r,x,y,tr));
}
int main(){
scanf("%d%d%d",&n,&m,&q);
for(int i = 1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i = 1;i<=m;i++){
scanf("%d",&b[i]);
}
build(1,1,n,wa,a);
build(1,1,m,wb,b);
int l1,l2,r1,r2;
node n1,n2;
long long ans = 0;
while(q--){
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
n1 = query(1,1,n,l1,r1,wa);
n2 = query(1,1,m,l2,r2,wb);
if(n2.mif!=0&&n2.miz==0){
if(n1.mif!=0){
ans = (n2.zero)?0:n1.mif*n2.maf;
}else{
ans = (n1.zero)?0:n1.miz*n2.mif;
}
}else if(n2.mif==0&&n2.miz!=0){
if(n1.miz!=0){
ans = (n2.zero)?0:n1.maz*n2.miz;
}else{
ans = (n1.zero)?0:n1.maf*n2.maz;
}
}else{
if(n1.zero){
ans = 0;
}else if(n1.mif!=0&&n1.miz==0){
ans = n1.maf*n2.maz;
}else if(n1.mif==0&&n1.miz!=0){
ans = n1.miz*n2.mif;
}else{
ans = max(n1.miz*n2.mif,n1.maf*n2.maz);
}
}
printf("%lld\n",ans);
}
return 0;
}
#### 代码2
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int n,m,q,a[N],b[N];
struct node{
long long maz,miz,maf,mif,zero;
}ta[N*4],tb[N*4];
node pushup(node lc,node rc){
node res;
if(lc.maz&&rc.maz){
res.maz = max(lc.maz,rc.maz);
res.miz = min(lc.miz,rc.miz);
}else{
res.maz = lc.maz+rc.maz;
res.miz = lc.miz+rc.miz;
}
if(lc.maf&&rc.maf){
res.maf = max(lc.maf,rc.maf);
res.mif = min(lc.mif,rc.mif);
}else{
res.maf = lc.maf+rc.maf;
res.mif = lc.mif+rc.mif;
}
res.zero = lc.zero||rc.zero;
return res;
}
void build(int k,int l,int r,node tr[],int e[]){
if(l==r){
if(e[l]>0){
tr[k].maz = tr[k].miz = e[l];
}else if(e[l]<0){
tr[k].maf = tr[k].mif = e[l];
}else{
tr[k].zero = 1;
}
return;
}
int mid = l+r>>1;
build(k<<1,l,mid,tr,e);
build(k<<1|1,mid+1,r,tr,e);
tr[k] = pushup(tr[k<<1],tr[k<<1|1]);
}
node query(int k,int l,int r,int x,int y,node tr[]){
if(l>=x&&r<=y){
return tr[k];
}
int mid = l+r>>1;
if(x>mid)return query(k<<1|1,mid+1,r,x,y,tr);
if(y<=mid)return query(k<<1,l,mid,x,y,tr);
return pushup(query(k<<1,l,mid,x,y,tr),query(k<<1|1,mid+1,r,x,y,tr));
}
int main(){
scanf("%d%d%d",&n,&m,&q);
for(int i = 1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i = 1;i<=m;i++){
scanf("%d",&b[i]);
}
build(1,1,n,ta,a);
build(1,1,m,tb,b);
int l1,l2,r1,r2;
node n1,n2;
long long ans = 0;
while(q--){
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
n1 = query(1,1,n,l1,r1,ta);
n2 = query(1,1,m,l2,r2,tb);
if(n2.mif!=0&&n2.miz==0){
if(n1.mif!=0){
ans = (n2.zero)?0:n1.mif*n2.maf;
}else{
ans = (n1.zero)?0:n1.miz*n2.mif;
}
}else if(n2.mif==0&&n2.miz!=0){
if(n1.miz!=0){
ans = (n2.zero)?0:n1.maz*n2.miz;
}else{
ans = (n1.zero)?0:n1.maf*n2.maz;
}
}else{
if(n1.zero){
ans = 0;
}else if(n1.mif!=0&&n1.miz==0){
ans = n1.maf*n2.maz;
}else if(n1.mif==0&&n1.miz!=0){
ans = n1.miz*n2.mif;
}else{
ans = max(n1.miz*n2.mif,n1.maf*n2.maz);
}
}
printf("%lld\n",ans);
}
return 0;
}