求助,悬关
查看原帖
求助,悬关
631576
CYZZ楼主2023/8/10 23:15
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n,m,a[100005],b[100005],q,inf=1e9+1;
struct Seg_Tree
{
    int max0,min0,max1,min1;
}tr[400005][2];
void push_up(int p,int id)
{
    tr[p][id].max0=max(tr[2*p][id].max0,tr[2*p+1][id].max0);
    tr[p][id].max1=max(tr[2*p][id].max1,tr[2*p+1][id].max1);
    tr[p][id].min0=min(tr[2*p][id].min0,tr[2*p+1][id].min0);
    tr[p][id].min1=min(tr[2*p][id].min1,tr[2*p+1][id].min1);
}
void build(int p,int l,int r,int id)
{
    if(l==r)
    {
        int k=id?b[l]:a[l];
        if(k>=0)
        {
            tr[p][id].max0=tr[p][id].min0=k;
            tr[p][id].max1=-inf;
            tr[p][id].min1=inf;
        }
        else
        {
            tr[p][id].max0=-inf;
            tr[p][id].min0=inf;
            tr[p][id].max1=tr[p][id].min1=k;
        }
        return ;
    }
    int mid=(l+r)>>1;
    build(2*p,l,mid,id);
    build(2*p+1,mid+1,r,id);
    push_up(p,id);
}
int query_max(int p,int l,int r,int x,int y,int id,int rk)
{
    if(x<=l&&y>=r)
    {
        if(!rk)
            return tr[p][id].max0;
        return tr[p][id].max1;
    }
    int mid=(l+r)>>1,ret=-inf;
    if(x<=mid)
        ret=max(ret,query_max(2*p,l,mid,x,y,id,rk));
    if(y>mid)
        ret=max(ret,query_max(2*p+1,mid+1,r,x,y,id,rk));
    return ret;
}
int query_min(int p,int l,int r,int x,int y,int id,int rk)
{
    if(x<=l&&y>=r)
    {
        if(!rk)
            return tr[p][id].min0;
        return tr[p][id].min1;
    }
    int mid=(l+r)>>1,ret=inf;
    if(x<=mid)
        ret=min(ret,query_min(2*p,l,mid,x,y,id,rk));
    if(y>mid)
        ret=min(ret,query_min(2*p+1,mid+1,r,x,y,id,rk));
    return ret;
}
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,0);
    build(1,1,m,1);
    while(q--)
    {
        int l1,r1,l2,r2;
        ll ans1=-1e18,ans2=-1e18;
        scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
        int x_a=query_max(1,1,n,l1,r1,0,0),y_a=query_min(1,1,n,l1,r1,0,0),p_a=query_max(1,1,n,l1,r1,0,1),s_a=query_min(1,1,n,l1,r1,0,1);
        if(x_a!=-inf)//A选非负数
        {
            int y_b=query_min(1,1,m,l2,r2,1,0),s_b=query_min(1,1,m,l2,r2,1,1);
            if(s_b!=inf)//B有负数
                ans1=1ll*y_a*s_b;
            else//B只有非负数
                ans1=max(ans1,1ll*x_a*y_b);
            cout << ans1 << " ";
        }
        if(p_a!=inf)//A选负数
        {
            int x_b=query_max(1,1,m,l2,r2,1,0),p_b=query_max(1,1,m,l2,r2,1,1);
            if(x_b!=-inf)//B选非负数
                ans2=1ll*p_a*x_b;
            else//B只有负数
                ans2=max(ans2,1ll*s_a*p_b);
        }

        printf("%lld\n",max(ans1,ans2));
    }
}
2023/8/10 23:15
加载中...