请路过的大佬们来看看,萌新求调
查看原帖
请路过的大佬们来看看,萌新求调
600315
neilliu楼主2023/9/27 23:11
#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,m,q;
long long a[100005],b[100005];
long long a_min[100005][30],a_max[100005][30],a_minus_max[100005][30],a_not_minus_min[100005][30];
long long b_max[100005][30],b_min[100005][30];
void init_a(){
    for(int i = 1; i <= n; i++){
        a_min[i][0] = a_max[i][0] = a[i];
        if(a[i] >= 0) a_minus_max[i][0] = -1e18,a_not_minus_min[i][0] = a[i];
        if(a[i] < 0) a_minus_max[i][0] = a[i],a_not_minus_min[i][0] = 1e18;
    }
    int t = log(n) / log(2) + 1;
    for(int j = 1; j < t; j++){
        for(int i = 1; i <= n - (1 << j) + 1; i++){
            a_max[i][j] = max(a_max[i][j-1],a_max[i+(1<<(j-1))][j-1]);
            a_min[i][j] = min(a_min[i][j-1],a_min[i+(1<<(j-1))][j-1]);
            a_minus_max[i][j] = max(a_minus_max[i][j-1],a_minus_max[i+(1<<(j-1))][j-1]);
            a_not_minus_min[i][j] = min(a_not_minus_min[i][j-1],a_not_minus_min[i+(1<<(j-1))][j-1]);
        }
    }
}
void init_b()
{
    for(int i = 1; i <= m; i++) b_max[i][0] = b_min[i][0] = b[i];
    int t = log(m) / log(2) + 1;
    for(int j = 1; j < t; j++){
        for(int i = 1; i <= n - (1<<j) + 1; i++){
            b_max[i][j] = max(b_max[i][j-1],b_max[i + (1<<(j-1))][j-1]);
            b_min[i][j] = min(b_min[i][j-1],b_min[i + (1<<(j-1))][j-1]);
        }
    }
}
long long ask(int l,int r,int id)
{
    int t = log(r - l + 1) / log(2);
    if(id == 1) return max(a_max[l][t],a_max[r - (1<<t) + 1][t]);
    if(id == 2) return min(a_min[l][t],a_min[r - (1<<t) + 1][t]);
    if(id == 3) return max(a_minus_max[l][t],a_minus_max[r - (1<<t) + 1][t]);
    if(id == 4) return min(a_not_minus_min[l][t],a_not_minus_min[r - (1<<t) + 1][t]);
    if(id == 5) return max(b_max[l][t],b_max[r - (1<<t) + 1][t]);
    if(id == 6) return min(b_min[l][t],b_min[r - (1<<t) + 1][t]);
}
int main()
{
    //freopen("game3.in","r",stdin);
    //freopen("game3.out","w",stdout);
    scanf("%d%d%d",&n,&m,&q);
    for(int i = 1; i <= n; i++) scanf("%lld",&a[i]);
    for(int i = 1; i <= m; i++) scanf("%lld",&b[i]);
    init_a();
    init_b();
    while(q--){
        int l1,r1,l2,r2; scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
        long long ans = -1e18;
        long long tmp1 = ask(l1,r1,1),tmp2 = ask(l1,r1,2),tmp3 = ask(l1,r1,3),tmp4 = ask(l1,r1,4);
        long long tmp5 = ask(l2,r2,5),tmp6 = ask(l2,r2,6);
        if(tmp1 >= 0) ans = max(ans,tmp1 * tmp6);
        else ans = max(ans,tmp1 * tmp5);
        if(tmp2 >= 0) ans = max(ans,tmp2 * tmp6);
        else ans = max(ans,tmp2 * tmp5);
        if(tmp3 >= 0) ans = max(ans,tmp3 * tmp6);
        else ans = max(ans,tmp3 * tmp5);
        if(tmp4 >= 0) ans = max(ans,tmp4 * tmp6);
        else ans = max(ans,tmp4 * tmp5);
        printf("%lld\n",ans);
    }
    return 0;
}

AC #11 #12,其他全错

2023/9/27 23:11
加载中...