0pts求调教
查看原帖
0pts求调教
684865
ZYU_楼主2022/11/7 13:04

1-5WA,6-20RE

样例输出全是0

using namespace std;
int n,m,q,l1,l2,r1,r2;
int A[114514],B[114514];
int sta[114514][100][4],stb[114514][100][2],lg[100];
int posma,posmi,negma,negmi,mab,mib;
long long ans;
void init_A();
void init_B();
void init_find(int i,int j,int i2,int j2);

int main()
{
    for (int i = 2,M=max(m,n); i <= M; ++i)
        lg[i] = lg[i / 2] + 1;//初始化log2(N)
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++){
        scanf("%d",&A[i]);
    }
    init_A();
    for(int i=1;i<=m;i++){
        scanf("%d",&B[i]);
    }
    init_B();//输入和初始化
    while(q--){
        scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
        init_find(l1,r1,l2,r2);//查找
        if(mab<0){
            if(negmi==INT_MAX)printf("%d",mab*posmi);
            else printf("%d",mab*negmi);
        }
        else if(mib>0)
        {
            if(posma==INT_MIN)printf("%d",mib*negma);
            else printf("%d",mab*posma);
        }
        else{
            if(posma==INT_MIN){
                printf("%d",mab*negma);
            }
            else if(negmi==INT_MAX){
                printf("%d",mib*posmi);
            }
            else{
                printf("%d",max(mab*negma,mib*posmi));
            }
        }
    }
    return 0;
}

//////////////////////////////////////////////////////////////////////////////////////

void init_A()
{
    for(int i=1;i<=n;i++)
    {
        if(A[i]>=0){
            sta[i][0][1]=A[i];sta[i][0][0]=A[i];
            sta[i][0][2]=INT_MIN;sta[i][0][3]=INT_MAX;
        }
        else {
            sta[i][0][1]=INT_MIN;sta[i][0][0]=INT_MAX;
            sta[i][0][2]=A[i];sta[i][0][3]=A[i];
        }

    }
    int k =lg[n];
    for(int j=1;j<=k;j++)
        for(int i=n;i>=1;i--)
            if(i+(1<<(j-1))<=n){
                sta[i][j][0]=min(sta[i][j-1][0],sta[i+(1<<(j-1))][j-1][0]);
                sta[i][j][1]=max(sta[i][j-1][1],sta[i+(1<<(j-1))][j-1][1]);
                sta[i][j][2]=min(sta[i][j-1][2],sta[i+(1<<(j-1))][j-1][2]);
                sta[i][j][3]=max(sta[i][j-1][3],sta[i+(1<<(j-1))][j-1][3]);
            }
    return;
}

void init_B()
{
    for(int i=1;i<=n;i++)
    {
        if(A[i]>=0){
            stb[i][0][1]=B[i];stb[i][0][0]=B[i];
            stb[i][0][2]=INT_MAX;stb[i][0][3]=INT_MIN;
        }
        else {
            stb[i][0][1]=INT_MIN;stb[i][0][0]=INT_MAX;
            stb[i][0][2]=B[i];stb[i][0][3]=B[i];
        }
    }
    int k =lg[n];
    for(int j=1;j<=k;j++)
        for(int i=n;i>=1;i--)
            if(i+(1<<(j-1))<=n)
            {
                stb[i][j][0]=min(stb[i][j-1][0],stb[i+(1<<(j-1))][j-1][0]);
                stb[i][j][1]=max(stb[i][j-1][1],stb[i+(1<<(j-1))][j-1][1]);
            }
    return;
}

void init_find(int i,int j,int i2,int j2)
{
    int k=lg[j-i+1],k2=lg[j2-i2+1];
    posma=max(sta[i][k][0],sta[j+(1<<k)+1][k][0]);
    posmi=min(sta[i][k][1],sta[j+(1<<k)+1][k][1]);
    negma=max(sta[i][k][2],sta[j+(1<<k)+1][k][2]);
    negmi=min(sta[i][k][3],sta[j+(1<<k)+1][k][3]);
    mab=max(stb[i2][k][0],stb[j2+(1<<k)+1][k][0]);
    mib=min(stb[i2][k][1],stb[j2+(1<<k)+1][k][1]);
}
2022/11/7 13:04
加载中...