Submission #965161

#TimeUsernameProblemLanguageResultExecution timeMemory
965161weakweakweakGarden (JOI23_garden)C++17
0 / 100
4 ms1368 KiB
//被嗆
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int,int>;
 
#pragma GCC optimize("Ofast")

#define fs first
#define sc second
 
int n, m, d;
 
struct special_set {
    set<int> sts;
    multiset<int> mst;
    int cnt[10010] = {0};
    int query () {
        int z = *mst.rbegin();
        z = max(z, *sts.begin() + d - *sts.rbegin());
        return d - *mst.rbegin() + 1;
    }    
    void add (int x) {
        if (x >= d) return;
        cnt[x]++;
        if (sts.find(x) != sts.end() or cnt[x] > 1) return;
        auto zz = sts.insert(x);
        auto it = zz.first;
        if (next(it) != sts.end() and it != sts.begin()) mst.erase(mst.find(*next(it) - *prev(it)));
        if (next(it) != sts.end()) mst.insert(*next(it) - x);
        if (it != sts.begin()) mst.insert(x - *prev(it));
    }
    void del (int x) {
        if (x >= d) return;
        cnt[x]--;
        auto it = sts.find(x);
        if (it == sts.end() or cnt[x] > 0) return;
        if (next(it) != sts.end() and it != sts.begin()) mst.insert(*next(it) - *prev(it));
        if (next(it) != sts.end()) mst.erase(mst.find(*next(it) - x));
        if (it != sts.begin()) mst.erase(mst.find(x - *prev(it)));
        sts.erase(it);
    }
}stx, sty;
 
pii a[5010], b[10010];
int ans = INT_MAX;
 
int main () {
    ios_base :: sync_with_stdio(false); cin.tie(0);
    cin >> n >> m >> d;
    for (int i = 0; i < n; i++) {
        cin >> a[i].fs >> a[i].sc;
        stx.add(a[i].fs);
        stx.add(a[i].fs + d);
        sty.add(a[i].sc);
        sty.add(a[i].sc + d);
    }
    for (int i = 0; i < m; i++) {
        cin >> b[i].fs >> b[i].sc;
        sty.add(b[i].sc);
        sty.add(b[i].sc + d);
    }
    ans = min(ans, stx.query() * sty.query());
    // for (int x : sty.mst) cout << x << ' ';
    // cout << '\n';
    // for (int x : sty.sts) cout << x << ' ';
    // cout << '\n';
 
    sort(b, b + m);
    for (int i = 0; i < m; i++) b[i + m] = b[i];
    for (int i = 0; i < m; i++) {
        // cout << "!" << ' ' << stx.query() << ' ' << sty.query() << '\n';
        for (int j = 0; j < m; j++) {
            stx.add(b[i + j].fs);
            stx.add(b[i + j].fs + d);
            sty.del(b[i + j].sc);
            sty.del(b[i + j].sc + d);
            // cout << i << ' ' << j << ' ' << stx.query() << ' ' << sty.query() << ' ' << stx.query() * sty.query() << '\n';
            ans = min(ans, stx.query() * sty.query());
        }
        for (int j = 0; j < m; j++) {
            stx.del(b[i + j].fs);
            stx.del(b[i + j].fs + d);
            sty.add(b[i + j].sc);
            sty.add(b[i + j].sc + d);
        }
    }
 
    cout << ans << '\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...