st表0分样例全过求条
查看原帖
st表0分样例全过求条
983519
Laisira楼主2024/7/12 16:30
#include<bits/stdc++.h>
#define int long long 
#define Maxn 100005 
using namespace std;
int f[4][Maxn][31],g[4][Maxn][31];
void init_mx(int n,int opt,int res[]) {
    int k = log2(n);
    for(int i=1;i<=n;i++)
        f[opt][i][0] = res[i];
    for(int j=1;j<=k;j++)
        for(int i=1;i<=n-(1<<j)+1;i++)
            f[opt][i][j] = max(f[opt][i][j-1],f[opt][i+(1<<(j-1))][j-1]);
}
void init_mn(int n,int opt,int res[]) {
    int k = log2(n);
    for(int i=1;i<=n;i++)
        g[opt][i][0] = res[i];
    for(int j=1;j<=k;j++)
        for(int i=1;i<=n-(1<<j)+1;i++)
            g[opt][i][j] = min(g[opt][i][j-1],g[opt][i+(1<<(j-1))][j-1]);
}
int Query_mx(int l, int r,int opt) {
    int k = log2(r-l+1);
    return max(f[opt][l][k], f[opt][r-(1<<k)+1][k]);
} 
int Query_mn(int l, int r,int opt) {
    int k = log2(r-l+1);
    return min(g[opt][l][k], g[opt][r-(1<<k)+1][k]);
} 
int a[Maxn],b[Maxn],res[Maxn];
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n,m,q;
    cin>>n>>m>>q;
    for(int opt=0;opt<4;opt++)
    for(int i=0;i<Maxn;i++)
        for(int j=0;j<31;j++)
            f[opt][i][j] = -INT_MAX;
    for(int opt=0;opt<4;opt++)
    for(int i=0;i<Maxn;i++)
        for(int j=0;j<31;j++)
            g[opt][i][j] = INT_MAX;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=m;i++)
        cin>>b[i];
    //f[0] a非负最大
    for(int i=1;i<=n;i++)
        res[i] = a[i];
    init_mx(n,0,res);
    //f[1] a负数最大
    for(int i=1;i<=n;i++)
        if(a[i] < 0)res[i] = a[i];
        else res[i] = -73998244353;
    init_mx(n,1,res);
    //f[2] b非负最大
    for(int i=1;i<=m;i++)
        res[i] = b[i];
    init_mx(m,2,res);
    //f[3] b负数最大
    for(int i=1;i<=m;i++)
        if(b[i] < 0)res[i] = b[i];
        else res[i] = -73998244353;
    init_mx(m,3,res);

    //g[0] a负最小
    for(int i=1;i<=n;i++)
        res[i] = a[i];
    init_mn(n,0,res);
    //g[1] a非负数最小
    for(int i=1;i<=n;i++)
        if(a[i] >= 0)res[i] = a[i];
        else res[i] = 73998244353;
    // for(int i=1;i<=n;i++)cout<<res[i]<<" ";cout<<" ||| \n";
    init_mn(n,1,res);
    //g[2] b负最小
    for(int i=1;i<=m;i++)
        res[i] = b[i];
    init_mn(m,2,res);
    //g[3] b非负数最小
    for(int i=1;i<=m;i++)
        if(b[i] >= 0)res[i] = b[i];
        else res[i] = 73998244353;
    init_mn(m,3,res);
    while(q--) {
        int l,r,L,R; cin>>l>>r>>L>>R;
        int ans = -INT_MAX,res;
        if(Query_mn(l,r,0) < 0) {
            res = INT_MAX;
            if(Query_mn(L,R,2)<0)
            res=min(res,Query_mn(l,r,0)*Query_mn(L,R,2));
            if(Query_mn(L,R,3)!=73998244353)
            res=min(res,Query_mn(l,r,0)*Query_mn(L,R,3));
            if(Query_mx(L,R,2)>=0)
            res=min(res,Query_mn(l,r,0)*Query_mx(L,R,2));
            if(Query_mx(L,R,3)!=-73998244353)
            res=min(res,Query_mn(l,r,0)*Query_mx(L,R,3));
            if(res != INT_MAX) ans = max(ans,res);
            // cout<<Query_mn(l,r,0)<<" "<<res<<"A ";
        }
        if(Query_mn(l,r,1) != 73998244353) {
            res = INT_MAX;
            if(Query_mn(L,R,2)<0)res=min(res,Query_mn(l,r,1)*Query_mn(L,R,2));
            if(Query_mn(L,R,3)!=73998244353)res=min(res,Query_mn(l,r,1)*Query_mn(L,R,3));
            if(Query_mx(L,R,2)>=0)res=min(res,Query_mn(l,r,1)*Query_mx(L,R,2));
            if(Query_mx(L,R,3)!=-73998244353)res=min(res,Query_mn(l,r,1)*Query_mx(L,R,3));
            if(res != INT_MAX) ans = max(ans,res);
            // cout<<Query_mn(l,r,1)<<" "<<res<<"B ";
        }
        if(Query_mx(l,r,0) >= 0){
            res = INT_MAX;
            if(Query_mn(L,R,2)<0)res=min(res,Query_mx(l,r,0)*Query_mn(L,R,2));
            if(Query_mn(L,R,3)!=73998244353)res=min(res,Query_mx(l,r,0)*Query_mn(L,R,3));
            if(Query_mx(L,R,2)>=0)res=min(res,Query_mx(l,r,0)*Query_mx(L,R,2));
            if(Query_mx(L,R,3)!=-73998244353)res=min(res,Query_mx(l,r,0)*Query_mx(L,R,3));
            if(res != INT_MAX) ans = max(ans,res);
            // cout<<Query_mx(l,r,0)<<" "<<res<<"C ";
        }
        if(Query_mx(l,r,1) != -73998244353) {
            res = INT_MAX;
            if(Query_mn(L,R,2)<0)res=min(res,Query_mx(l,r,1)*Query_mn(L,R,2));
            if(Query_mn(L,R,3)!=73998244353)res=min(res,Query_mx(l,r,1)*Query_mn(L,R,3));
            if(Query_mx(L,R,2)>=0)res=min(res,Query_mx(l,r,1)*Query_mx(L,R,2));
            if(Query_mx(L,R,3)!=-73998244353)res=min(res,Query_mx(l,r,1)*Query_mx(L,R,3));
            if(res != INT_MAX) ans = max(ans,res);
            // cout<<Query_mx(l,r,1)<<" "<<res<<"D ";
        } cout<<ans<<"\n";
    }
    return 0;
}
2024/7/12 16:30
加载中...