求民间数据#3
查看原帖
求民间数据#3
304524
崔化博楼主2022/10/30 19:45

求第三个点

hack一下也行?实在没调出来

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define int long long
#define N 100005
using namespace std;
struct node {
    int minn,maxn;
    node() {
        minn=2e9;
        maxn=-2e9;
    }
} f1[N][35],f2[N][35],f3[N][35];
//f1正数
int n,m,q;
int query1(int l,int r,int p,int q) { //p表示最大或最小 q正负
    int k=log2(r-l+1);
    if(!q) {
        if(!p)
            return max(f1[l][k].maxn,f1[r-(1<<k)+1][k].maxn);
        return min(f1[l][k].minn,f1[r-(1<<k)+1][k].minn);
    }
    if(!p)
        return max(f2[l][k].maxn,f2[r-(1<<k)+1][k].maxn);
    return min(f2[l][k].minn,f2[r-(1<<k)+1][k].minn);
}
int query2(int l,int r,int p) { //p最大最小
    int k=log2(r-l+1);
    if(!p)
        return max(f3[l][k].maxn,f3[r-(1<<k)+1][k].maxn);
    return min(f3[l][k].minn,f3[r-(1<<k)+1][k].minn);
}
signed main() {
//  freopen("game.in","r",stdin);
//  freopen("game.out","w",stdout);
    scanf("%lld%lld%lld",&n,&m,&q);
    for(int i=1; i<=n; ++i) {
        int a;
        scanf("%lld",&a);
        if(a>=0) {
            f1[i][0].maxn=f1[i][0].minn=a;
        } else {
            f2[i][0].maxn=f2[i][0].minn=-a;
        }
    }
    for(int i=1; i<=m; ++i) {
        int a;
        scanf("%lld",&a);
        f3[i][0].maxn=f3[i][0].minn=a;
    }
    for(int j=1; j<=29; ++j) {
        for(int i=1; i+(1<<j)-1<=n; ++i) {
            f1[i][j].maxn=max(f1[i][j-1].maxn,f1[i+(1<<(j-1))][j-1].maxn);
            f1[i][j].minn=min(f1[i][j-1].minn,f1[i+(1<<(j-1))][j-1].minn);
            f2[i][j].maxn=max(f2[i][j-1].maxn,f2[i+(1<<(j-1))][j-1].maxn);
            f2[i][j].minn=min(f2[i][j-1].minn,f2[i+(1<<(j-1))][j-1].minn);
        }
    }
    for(int j=1; j<=29; ++j) {
        for(int i=1; i+(1<<j)-1<=m; ++i) {
            f3[i][j].maxn=max(f3[i][j-1].maxn,f3[i+(1<<(j-1))][j-1].maxn);
            f3[i][j].minn=min(f3[i][j-1].minn,f3[i+(1<<(j-1))][j-1].minn);
        }
    }
    while(q--) {
        int l1,r1,l2,r2;
        scanf("%lld%lld%lld%lld",&l1,&r1,&l2,&r2);
        if(query2(l2,r2,1)<0) {
            if(query2(l2,r2,0)>=0){

                printf("%lld\n",max(1ll*query1(l1,r1,1,0)*query2(l2,r2,1),1ll*(-query1(l1,r1,1,1))*query2(l2,r2,0)));
            }
            else {
                if(query1(l1,r1,0,1)==-2e9)
                    printf("%lld\n",1ll*(query1(l1,r1,1,0))*query2(l2,r2,1));
                else
                    printf("%lld\n",1ll*(-query1(l1,r1,0,1))*query2(l2,r2,0));
            }
        } else {
            if(query1(l1,r1,0,0)==-2e9)
                printf("%lld\n",1ll*(-query1(l1,r1,1,1))*query2(l2,r2,0));
            else
                printf("%lld\n",1ll*query1(l1,r1,0,0)*query2(l2,r2,1));
        }
    }
    return 0;
}
2022/10/30 19:45
加载中...