st表40pts求助
查看原帖
st表40pts求助
111347
qianjh楼主2022/11/17 13:43

rt,原来写的和题解不太一样也40pts,改的和最高赞题解差不多也40pts,求助:

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const LL INF=114514191981010086;
const LL MINF=-114514191981010086;
LL n,m,q;
LL a[100001];
LL b[100001];
LL max_a[100001][51];
LL max_b[100001][51];
LL min_a[100001][51];
LL min_b[100001][51];
LL j1_a[100001][51]; // the smallest number in a which is above zero or equals zero
LL j2_a[100001][51]; // the biggest number in a which is below zero
LL lg[100001];
inline LL read()
{
    LL x=0,f=1;
    char ch=getchar();
    while(ch<'0' || ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
    {
        x=x*10+ch-48;
        ch=getchar();
    }
    return x*f;
}
inline LL a_search(LL l,LL r,LL flag)
{
    LL len=lg[r-l+1];
    if(flag==0)
        return max(max_a[l][len],max_a[r-(1<<len)+1][len]);
    else if(flag==1)
        return min(min_a[l][len],min_a[r-(1<<len)+1][len]);
    else if(flag==2)
        return min(j1_a[l][len],j1_a[r-(1<<len)+1][len]);
    else if(flag==3)
        return max(j2_a[l][len],j2_a[r-(1<<len)+1][len]);
}
inline LL b_search(LL l,LL r,LL flag)
{
    LL len=lg[r-l+1];
    if(flag==0)
        return max(max_b[l][len],max_b[r-(1<<len)+1][len]);
    else if(flag==1)
        return min(min_b[l][len],min_b[r-(1<<len)+1][len]);
}
int main()
{
//    freopen("game4.in","r",stdin);
//    freopen("game4.out","w",stdout);
    LL l1,r1,l2,r2,ans;
    LL amax,amin,bmax,bmin,afmax,azmin;
    n=read(),m=read(),q=read();
    for(LL i=1;i<=n;i++)
    {
        max_a[i][0]=min_a[i][0]=j1_a[i][0]=j2_a[i][0]=a[i]=read();
        if(a[i]<0)
            j1_a[i][0]=INF;
        else
            j2_a[i][0]=MINF;
    }
    for(LL i=1;i<=m;i++)
        max_b[i][0]=min_b[i][0]=b[i]=read();
    lg[1]=0;
    for(LL i=2;i<=max(m,n);i++)
        lg[i]=lg[i>>1]+1;
    for(LL j=1;j<=lg[n];j++)
        for(LL i=1;i<=n-(1<<j)+1;i++)
        {
            max_a[i][j]=max(max_a[i][j-1],max_a[i+(1<<(j-1))][j-1]);
            min_a[i][j]=min(min_a[i][j-1],min_a[i+(1<<(j-1))][j-1]);
            j1_a[i][j]=min(j1_a[i][j-1],j1_a[i+(1<<(j-1))][j-1]);
            j2_a[i][j]=max(j2_a[i][j-1],j2_a[i+(1<<(j-1))][j-1]);
        }
    for(LL j=1;j<=lg[m];j++)
        for(LL i=1;i<=m-(1<<j)+1;i++)
        {
            max_b[i][j]=max(max_b[i][j-1],max_b[i+(1<<(j-1))][j-1]);
            min_b[i][j]=min(min_b[i][j-1],min_b[i+(1<<(j-1))][j-1]);
        }
    for(LL i=1;i<=q;i++)
    {
        ans=MINF;
        l1=read(),r1=read(),l2=read(),r2=read();
        amax=a_search(l1,r1,0),amin=a_search(l1,r1,1);
        bmax=b_search(l2,r2,0),bmin=b_search(l2,r2,1);
        afmax=a_search(l1,r1,3),azmin=a_search(l1,r1,2);
        ans=max(ans,amax*(amax>=0?bmin:bmax));
//        cout<<"#1 "<<ans<<endl;
        ans=max(ans,amin*(amin>=0?bmin:bmax));
//        cout<<"#2 "<<ans<<endl;
        if(afmax!=MINF)
            ans=max(ans,afmax*(afmax>=0?bmin:bmax));
//        cout<<"#3 "<<ans<<endl;
        if(azmin!=INF)
            ans=max(ans,azmin*(azmin>=0?bmin:bmax));
//        cout<<"#4 "<<ans<<endl;
        cout<<ans<<endl;
    }
    return 0;
}

qwq

2022/11/17 13:43
加载中...