CSP2022-S-2-策略游戏 TLE 0分 球调

#include<bits/stdc++.h>
using namespace std;
long long c1[100010],c2[100010],dp1[100010][23],dp2[100010][23],dp3[100010][23],dp4[100010][23],dp5[100010][23],dp6[100010][23];

int main()
{
    freopen("gam*e.in","r",stdin);
    freopen("game.out","w",stdout);
    int a,b,T;
    cin>>a>>b>>T;
    int k = log2(a);
    for(int i = 1;i<=a;i++)
    {
        cin>>c1[i];
        for(int j = 0;j<=k;j++)
        {
            dp1[i][j]=-1e18-7;
            dp3[i][j]=-1e18-7;
            dp2[i][j]=1e18+7;
            dp4[i][j]=1e18+7;
        }
    }
    for(int i = 1;i<=b;i++)
    {
        cin>>c2[i];
        for(int j = 0;j<=k;j++)
        {
            dp5[i][j]=-1e18-7;
            dp6[i][j]=1e18+7;
        }
    }
    for(int i = 1;i<=a;i++)
    {
        if(c1[i]>=0)
        {
            dp1[i][0]=c1[i];
            dp2[i][0]=c1[i];
        }
        else
        {
            dp3[i][0]=c1[i];
            dp4[i][0]=c1[i];
        }
        
    }
    for(int i = 1;i<=k;i++)
    {
        for(int j = 1;j<=a-(1<<i)+1;j++)
        {
            dp1[j][i]=max(dp1[j][i-1],dp1[j+(1<<(i-1))][i-1]);
            dp3[j][i]=max(dp3[j][i-1],dp3[j+(1<<(i-1))][i-1]);
            dp2[j][i]=min(dp2[j][i-1],dp2[j+(1<<(i-1))][i-1]);
            dp4[j][i]=min(dp4[j][i-1],dp4[j+(1<<(i-1))][i-1]);
        }
    }
    for(int i = 1;i<=b;i++)
    {
        dp5[i][0]=c2[i];
        dp6[i][0]=c2[i];
    }
    for(int i = 1;i<=k;i++)
    {
        for(int j = 1;j<=b-(1<<i)+1;j++)
        {
            dp5[j][i]=max(dp5[j][i-1],dp5[j+(1<<(i-1))][i-1]);
            dp6[j][i]=min(dp6[j][i-1],dp6[j+(1<<(i-1))][i-1]);
        }
    }
    while(T--)
    {
        int d,e,f,g;
        scanf("%d%d%d%d",&d,&e,&f,&g);
        int o = log2(e-d+1);
        int p = log2(g-f+1);
        long long ans1 = 1e18+7,ans2 = ans1,ans3=ans1,ans4=ans1;
        if(max(dp1[d][o],dp1[e-(1<<o)+1][o])!=-1e18-7)
        {
            ans1=min(max(dp1[d][o],dp1[e-(1<<o)+1][o])*max(dp5[f][p],dp5[g-(1<<p)+1][p]),max(dp1[d][o],dp1[e-(1<<o)+1][o])*min(dp6[f][p],dp6[g-(1<<p)+1][p]));
        }
        if(max(dp3[d][o],dp3[e-(1<<o)+1][o])!=-1e18-7)
        {
            ans2=min(max(dp3[d][o],dp3[e-(1<<o)+1][o])*max(dp5[f][p],dp5[g-(1<<p)+1][p]),max(dp3[d][o],dp3[e-(1<<o)+1][o])*min(dp6[f][p],dp6[g-(1<<p)+1][p]));
        }
        if(min(dp2[d][o],dp2[e-(1<<p)+1][o])!=1e18+7)
        {
            ans3=min(min(dp2[d][o],dp2[e-(1<<p)+1][o])*max(dp5[f][p],dp5[g-(1<<p)+1][p]),min(dp2[d][o],dp2[e-(1<<p)+1][o])*min(dp6[f][p],dp6[g-(1<<p)+1][p]));
        }
        if(min(dp4[d][o],dp4[e-(1<<p)+1][o])!=1e18+7)
        {
            ans4=min(min(dp4[d][o],dp4[e-(1<<p)+1][o])*max(dp5[f][p],dp5[g-(1<<p)+1][p]),min(dp4[d][o],dp4[e-(1<<p)+1][o])*min(dp6[f][p],dp6[g-(1<<p)+1][p]));
        }
        if(ans1==1e18+7)
        {
            ans1=-1e18-7;
        }
        if(ans2==1e18+7)
        {
            ans2=-1e18-7;
        }
        if(ans3==1e18+7)
        {
            ans3=-1e18-7;
        }
        if(ans4==1e18+7)
        {
            ans4=-1e18-7;
        }
        cout <<max(ans1,max(ans2,max(ans3,ans4)))<<endl;
    }
	return 0;
}

qwq想了好久

顶,我也不会