Submission #1159862

#TimeUsernameProblemLanguageResultExecution timeMemory
1159862itslq3D Histogram (COCI20_histogram)C++20
20 / 110
2595 ms50244 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

vector<int> A(2005), B(2005);

struct node {
    node *lc, *rc;
    int l, r, m, v;
    long long dv = 0;
    
    node(int S, int E) {
        l = S;
        r = E;
        m = (l + r) / 2;
        if (l == r) {
            v = A[l];
        } else {
            lc = new node(l, m);
            rc = new node(m + 1, r);
            v = min(lc -> v, rc -> v);
        }
    }
    
    int query(int S, int E) {
        if (l == S && r == E) return v + dv;
        if (E <= m) return lc -> query(S, E) + dv;
        if (S > m) return rc -> query(S, E) + dv;
        return min(lc -> query(S, m), rc -> query(m + 1, E)) + dv;
    }
    
    void update(int S, int E, int D) {
        int total;
        if (l == S && r == E) {
            dv += D;
            return;
        }
        else if (E <= m) lc -> update(S, E, D);
        else if (S > m) rc -> update(S, E, D);
        else {
            lc -> update(S, m, D); 
            rc -> update(m + 1, E, D);
        }
        
        v = min(lc -> v + lc -> dv, rc -> v + rc -> dv);
    }
} *root1, *root2;

signed main() {
    int N, M = 0;
    cin >> N;
    
    for (int i = 0; i < N; i++) cin >> A[i] >> B[i];
    root1 = new node(0, N);

    A = B;
    root2 = new node(0, N);
    
    for (int i = 0; i < N; i++) {
        for (int j = i; j < N; j++) {
            M = max(M, root1 -> query(i, j) * root2 -> query(i, j) * (j - i + 1));
        }
    }

    cout << M;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...