ST 样例不过求调
查看原帖
ST 样例不过求调
714254
tder楼主2024/1/13 15:59
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 5;
struct Node {
    int mxp = -1, mnp = -1, mxn = 1, mnn = 1;
} s1[N][(int)log2(N) + 5], s2[N][(int)log2(N) + 5];
Node merge(Node a, Node b) {
    Node r;
    r.mxp = max(a.mxp, b.mxp);
    if(a.mnp >= 0 && (r.mnp < 0 || a.mnp < r.mnp)) r.mnp = a.mnp; 
    if(b.mnp >= 0 && (r.mnp < 0 || b.mnp < r.mnp)) r.mnp = b.mnp; 
    r.mnn = min(a.mnn, b.mnn);
    if(a.mxn < 0 && (r.mxn >= 0 || a.mxn > r.mxn)) r.mxn = a.mxn; 
    if(b.mxn < 0 && (r.mxn >= 0 || b.mxn > r.mxn)) r.mxn = b.mxn; 
    return r;
}
void build(int p[], int s, Node t[][(int)log2(N) + 5]) {
    for(int i = 1; i <= s; i++)
        if(p[i] >= 0) t[i][0].mxp = t[i][0].mnp = p[i];
        else t[i][0].mxn = t[i][0].mnn = p[i];
    int l = log2(s) + 5;
    for(int j = 1; j < l; j++)
        for(int i = pow(2, j); i <= s; i++)
            t[i][j] = merge(t[i][j - 1], t[i - (int)pow(2, j - 1)][j - 1]);
}
vector<int> get(Node t[][(int)log2(N) + 5], int l, int r) {
    vector<int> v;
    int k = log2(r - l + 1);
    Node c = merge(t[r][k], t[l + (int)pow(2, k) - 1][k]);
    if(c.mxp >= 0) {
        v.push_back(c.mxp);
        v.push_back(c.mnp);
    } 
    if(c.mxn < 0) {
        v.push_back(c.mxn);
        v.push_back(c.mnn);
    }
    return v;
}
int n, m, q, a[N], b[N];
signed main() {
    cin>>n>>m>>q;
    for(int i = 1; i <= n; i++) cin>>a[i];
    for(int i = 1; i <= m; i++) cin>>b[i];
    build(a, n, s1);
    build(b, m, s2);
    while(q--) {
        int l1, r1, l2, r2;
        cin>>l1>>r1>>l2>>r2;
        auto v1 = get(s1, l1, r1), v2 = get(s2, l2, r2);
        int ans = -1e18;
        for(auto i : v1) {
            int k = 1e18;
            for(auto j : v2) k = min(k, i * j);
            ans = max(ans, k);
        }
        cout<<ans<<endl;
    }
    return 0;
}
2024/1/13 15:59
加载中...