90分求助
查看原帖
90分求助
377440
Y2y7m楼主2022/11/2 14:22
#include <bits/stdc++.h>
//100pts
using namespace std;
#define int long long
#define lson 2*i
#define rson 2*i+1
const int maxn=1e5+10;
struct node
{
    struct st
    {
        int l,r;
        int nabs,pabs;
        int minn,mx;
    }t[4*maxn];
    void pushup(int i)
    {
        t[i].minn=min(t[lson].minn,t[rson].minn);
        t[i].mx=max(t[lson].mx,t[rson].mx);
        t[i].nabs=min(t[lson].nabs,t[rson].nabs);
        t[i].pabs=min(t[lson].pabs,t[rson].pabs);
    }
    void build(int i,int l,int r,int *a)
    {
        t[i].l=l,t[i].r=r,t[i].nabs=t[i].pabs=t[i].minn=t[i].mx=0;
        if(l==r)
        {
            t[i].mx=t[i].minn=a[l];
            if(a[l]<0)
                t[i].nabs=-a[l],t[i].pabs=2e9;
            else
                t[i].pabs=a[l],t[i].nabs=2e9;
            return ;
        }
        int mid=(l+r)/2;
        build(lson,l,mid,a);
        build(rson,mid+1,r,a);
        pushup(i);
    }
    int query_min(int i,int l,int r)
    {
        if(l<=t[i].l&&t[i].r<=r)
        {
            return t[i].minn;
        }
        int e=2e9;
        if(l<=t[lson].r)
        {
            e=min(e,query_min(lson,l,r));
        }
        if(t[rson].l<=r)
            e=min(e,query_min(rson,l,r));
        return e;
    }
    int query_max(int i,int l,int r)
    {
        if(l<=t[i].l&&t[i].r<=r)
        {
            return t[i].mx;
        }
        int e=-2e9;
        if(l<=t[lson].r)
        {
            e=max(e,query_max(lson,l,r));
        }
        if(t[rson].l<=r)
            e=max(e,query_max(rson,l,r));
        return e;
    }
    int query_nabs(int i,int l,int r)
    {
        if(l<=t[i].l&&t[i].r<=r)
        {
            return t[i].nabs;
        }
        int e=2e9;
        if(l<=t[lson].r)
        {
            e=min(e,query_nabs(lson,l,r));
        }
        if(t[rson].l<=r)
            e=min(e,query_nabs(rson,l,r));
        return e;
    }
    int query_pabs(int i,int l,int r)
    {
        if(l<=t[i].l&&t[i].r<=r)
        {
            return t[i].pabs;
        }
        int e=2e9;
        if(l<=t[lson].r)
        {
            e=min(e,query_pabs(lson,l,r));
        }
        if(t[rson].l<=r)
            e=min(e,query_pabs(rson,l,r));
        return e;
    }
}t1,t2;
int n,m,q;
int a[maxn],b[maxn];
signed main()
{
    // freopen("game.in","r",stdin);
    // freopen("game.out","w",stdout);
    ios::sync_with_stdio(false);
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=m;i++)
        cin>>b[i];
    t1.build(1,1,n,a);
    t2.build(1,1,m,b);
    int l1,r1,l2,r2;
    while(q--)
    {
        cin>>l1>>r1>>l2>>r2;
        int mx1=t1.query_max(1,l1,r1),minn1=t1.query_min(1,l1,r1),mx2=t2.query_max(1,l2,r2),minn2=t2.query_min(1,l2,r2);
        int pabs1=t1.query_pabs(1,l1,r1),nabs1=t1.query_nabs(1,l1,r1);
        int pabs2=t2.query_pabs(1,l2,r2),nabs2=t2.query_nabs(1,l2,r2);
        //cout<<mx1<<" "<<mx2<<" "<<minn1<<" "<<minn2<<" "<<pabs1<<" "<<nabs1<<endl;
        if(minn2>=0)
        {
            if(mx1>=0)
                cout<<mx1*minn2<<endl;
            else
            {
                cout<<-mx2*nabs1<<endl;
            }
        }
        else if(mx2<0)
        {
            if(minn1>=0)
            {
                cout<<minn2*pabs1<<endl;
            }
            else
                cout<<minn1*mx2<<endl;
        }
        else
        {
            cout<<max(-nabs1*mx2,pabs1*minn2)<<endl;
        }
    }
	return 0;
}
2022/11/2 14:22
加载中...