Submission #1347171

#TimeUsernameProblemLanguageResultExecution timeMemory
1347171model_codeGarden 3 (JOI26_garden)C++20
100 / 100
1535 ms47672 KiB
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using ll = long long;

struct LazySegtree {
    vector<ll> A;
    vector<ll> B;
    int N;

    LazySegtree(ll n) {
        N = 1;
        while (N < n) N *= 2;
        A.assign(N * 2, 0);
        B.assign(N * 2, 0);
    }

    void apply_node(ll i, ll a) {
        B[i] += a;
        A[i] += a;
    }

    void push(ll i) {
        if (i < N) {
            apply_node(i * 2, B[i]);
            apply_node(i * 2 + 1, B[i]);
            B[i] = 0;
        }
    }

    void aggr(ll i) {
        A[i] = max(A[i * 2], A[i * 2 + 1]);
    }

    void apply_rec(ll l, ll r, ll a, ll pl, ll pr, ll i) {
        if (r <= pl || pr <= l) return;
        if (l <= pl && pr <= r) {
            apply_node(i, a);
            return;
        }
        push(i);
        apply_rec(l, r, a, pl, (pl + pr) / 2, i * 2);
        apply_rec(l, r, a, (pl + pr) / 2, pr, i * 2 + 1);
        aggr(i);
    }

    void apply(ll l, ll r, ll a) {
        apply_rec(l, r, a, 0, N, 1);
    }

    ll get() {
        return A[1];
    }
};

vector<ll> argmin_x_no_less_than_X(
    ll N,
    const vector<ll>& U,
    const vector<ll>& D,
    const vector<ll>& L,
    const vector<ll>& R,
    const vector<ll>& C,
    ll X
) {
    vector<ll> posY;
    for (ll i = 0; i < N; i++) {
        posY.push_back(U[i]);
        posY.push_back(D[i]);
    }
    sort(posY.begin(), posY.end());

    vector<pair<ll, ll>> events;
    for (ll i = 0; i < N; i++) {
        events.push_back({ L[i], N + i });
        events.push_back({ R[i], i });
    }
    sort(events.begin(), events.end());
    
    LazySegtree ds(posY.size());
    vector<ll> entered(N);
    vector<ll> ans(N, -1);
    ll T = N - 1;

    auto add = [&](ll u, ll d, ll c) -> void {
        u = lower_bound(posY.begin(), posY.end(), u) - posY.begin();
        d = lower_bound(posY.begin(), posY.end(), d) - posY.begin();
        ds.apply(u, d, c);
    };

    for (auto [t, ev] : events) {
        if (ev < N) {
            ll e = ev;
            if (entered[e]) {
                add(U[e], D[e], -C[e]);
                entered[e] = 0;
            }
        }
        else {
            ll e = ev - N;
            if (e <= T) {
                add(U[e], D[e], C[e]);
                entered[e] = 1;
            }

            while (ds.get() >= X) {
                ans[T] = t;
                if (entered[T]) {
                    add(U[T], D[T], -C[T]);
                    entered[T] = 0;
                }
                T--;
            }
        }
    }

    return ans;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    ll H, W, N, X;
    cin >> H >> W >> N >> X;

    vector<ll> L(N), R(N), U(N), D(N), C(N);
    for (ll i = 0; i < N; i++) {
        cin >> U[i] >> D[i] >> L[i] >> R[i] >> C[i];
        U[i]--;
        L[i]--;
    }

    vector<vector<ll>> result;

    for (ll dir = 0; dir < 4; dir++) {
        result.push_back(argmin_x_no_less_than_X(N, U, D, L, R, C, X));

        for (ll i = 0; i < N; i++) {
            L[i] = W - L[i];
            R[i] = W - R[i];
        }
        swap(L, U);
        swap(U, R);
        swap(R, D);
        swap(H, W);
    }

    vector<ll> ans(N);
    for (ll i = 0; i < N; i++) {
        if (result[0][i] != -1) {
            ans[i] = (W - result[0][i] - result[2][i]) * (H - result[1][i] - result[3][i]);
        }
    }

    for (ll i = 0; i < N; i++) {
        cout << ans[i] << "\n";
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...