Submission #950494

#TimeUsernameProblemLanguageResultExecution timeMemory
950494arbuzickGarden (JOI23_garden)C++17
45 / 100
3063 ms13420 KiB
#pragma GCC optimize("Ofast,no-stack-protector")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("fast-math")
#include <bits/stdc++.h>

using namespace std;

void solve() {
    int n, m, d;
    cin >> n >> m >> d;
    vector<int> p(n), q(n);
    for (int i = 0; i < n; ++i) {
        cin >> p[i] >> q[i];
    }
    vector<int> r(m), s(m);
    for (int i = 0; i < m; ++i) {
        cin >> r[i] >> s[i];
    }
    int ans = d * d;
    if (m <= 8) {
        vector<int> p_nw, q_nw;
        for (int i = 0; i < n; ++i) {
            p_nw.push_back(p[i]);
            p_nw.push_back(p[i] + d);
            q_nw.push_back(q[i]);
            q_nw.push_back(q[i] + d);
        }
        sort(p_nw.begin(), p_nw.end());
        sort(q_nw.begin(), q_nw.end());
        for (int mask = 0; mask < (1 << m); ++mask) {
            int mnx = d, mny = d;
            for (int i = 0; i < d; ++i) {
                int posx = lower_bound(p_nw.begin(), p_nw.end(), i) - p_nw.begin();
                int rx = p_nw[posx + n - 1] + 1;
                for (int j = 0; j < m; ++j) {
                    if (mask & (1 << j)) {
                        if (i <= r[j]) {
                            rx = max(rx, r[j] + 1);
                        } else {
                            rx = max(rx, r[j] + d + 1);
                        }
                    }
                }
                mnx = min(mnx, rx - i);
                int posy = lower_bound(q_nw.begin(), q_nw.end(), i) - q_nw.begin();
                int ry = q_nw[posy + n - 1] + 1;
                for (int j = 0; j < m; ++j) {
                    if (!(mask & (1 << j))) {
                        if (i <= s[j]) {
                            ry = max(ry, s[j] + 1);
                        } else {
                            ry = max(ry, s[j] + d + 1);
                        }
                    }
                }
                mny = min(mny, ry - i);
            }
            ans = min(ans, mnx * mny);
        }
    } else {
        for (int lx = 0; lx < d; ++lx) {
            int rx = lx + 1;
            set<int> pos;
            multiset<int> diff;
            for (int i = 0; i < n; ++i) {
                if (lx <= p[i]) {
                    rx = max(rx, p[i] + 1);
                } else {
                    rx = max(rx, p[i] + d + 1);
                }
                pos.insert(q[i]);
            }
            for (int i = 0; i < d; ++i) {
                if (pos.count(i)) {
                    auto it = pos.upper_bound(i);
                    if (it != pos.end()) {
                        diff.insert(*it - i - 1);
                    }
                }
            }
            vector<int> inds(m);
            iota(inds.begin(), inds.end(), 0);
            sort(inds.begin(), inds.end(), [&](int i, int j) {
                int ri = rx, rj = rx;
                if (lx <= r[i]) {
                    ri = max(ri, r[i] + 1);
                } else {
                    ri = max(ri, r[i] + d + 1);
                }
                if (lx <= r[j]) {
                    rj = max(rj, r[j] + 1);
                } else {
                    rj = max(rj, r[j] + d + 1);
                }
                return ri < rj;
            });
            auto get_min_len = [&]() -> int {
                int ans = d;
                ans = min(ans, *pos.rbegin() - *pos.begin() + 1);
                if (!diff.empty()) {
                    ans = min(ans, d - *diff.rbegin());
                }
                return ans;
            };
            vector<int> rys(m + 1);
            rys[m] = get_min_len();
            for (int i = m - 1; i >= 0; --i) {
                if (!pos.count(s[inds[i]])) {
                    auto it = pos.lower_bound(s[inds[i]]);
                    if (it != pos.end()) {
                        if (it != pos.begin()) {
                            auto it2 = it;
                            it2--;
                            diff.erase(diff.find(*it - *it2 - 1));
                        }
                        diff.insert(*it - s[inds[i]] - 1);
                    }
                    if (it != pos.begin()) {
                        it--;
                        diff.insert(s[inds[i]] - *it - 1);
                    }
                    pos.insert(s[inds[i]]);
                }
                rys[i] = get_min_len();
            }
            for (int i = 0; i < m; ++i) {
                ans = min(ans, (rx - lx) * rys[i]);
                if (lx <= r[inds[i]]) {
                    rx = max(rx, r[inds[i]] + 1);
                } else {
                    rx = max(rx, r[inds[i]] + d + 1);
                }
            }
            ans = min(ans, (rx - lx) * rys[m]);
        }
    }
    cout << ans << '\n';
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1;
    // cin >> t;
    while (t--) {
        solve();
    }
    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...