Submission #1137086

#TimeUsernameProblemLanguageResultExecution timeMemory
1137086RaresFelixHamburg Steak (JOI20_hamburg)C++20
15 / 100
74 ms22600 KiB
#include <bits/stdc++.h>

using namespace std;

//#define int ll

using ll = long long;
using vi = vector<int>;
using ii = pair<int, int>;
using vll = vector<ll>;

const int INF = 1e9 + 71;

struct steak {
    ii h, v;
    bool inside(ii pct) {
        return h.first <= pct.first && pct.first <= h.second
            && v.first <= pct.second && pct.second <= v.second;
    }
};

ii seg_extremums(vector<ii> V) {
    int l = -INF, r = INF;
    for(auto [s, d] : V) {
        l = max(l, s);
        r = min(r, d);
    }
    return {l, r};
}

tuple<int, int, int, int> get_steak_extremums(vector<steak> S) {
    vector<ii> H, V;
    for(auto [h, v] : S) {
        H.push_back(h); V.push_back(v);
    }
    auto [lh, rh] = seg_extremums(H);
    auto [lv, rv] = seg_extremums(V);
    return {lh, rh, lv, rv};
}

vector<ii> sol_k2(vector<steak> S) {
    ///will return the solution if it satisfies everyone
    auto [lh, rh, lv, rv] = get_steak_extremums(S);

    vector<ii> re;
    auto check_sol = [&](ii p1, ii p2) -> bool{
        bool ok = true;
        for(auto it : S) {
            ok &= it.inside(p1) || it.inside(p2);
            if(!ok) break;
        }
        if(ok) {
            re = vector<ii>{p1, p2};
        }
        return ok;
    };
    check_sol(ii{lh, lv}, ii{rh, rv});
    check_sol(ii{lh, rv}, ii{rh, lv});
    return re;
}

vector<ii> sol_k1(vector<steak> S) {
    auto [lh, rh, lv, rv] = get_steak_extremums(S);
    if(lh <= rh && lv <= rv) return vector<ii>{ii{lh, lv}};
    return vector<ii>();
}

vector<ii> sol_k3(vector<steak> S) {
    ///will return the solution if it satisfies everyone
    auto [lh, rh, lv, rv] = get_steak_extremums(S);

    vector<ii> Re;
    auto check_rest = [&](ii p) {
        vector<steak> LeftOver;
        for(auto it : S)
            if(!it.inside(p)) LeftOver.push_back(it);
        auto Cur = sol_k2(LeftOver);
        if(!Cur.empty()) {
            Cur.push_back(p);
            Re = Cur;
        }
    };
    check_rest({lh, lv});
    check_rest({lh, rv});
    check_rest({rh, lv});
    check_rest({rh, rv});
    return Re;
}

int main() {
    cin.tie(0);
    ios_base::sync_with_stdio(0);
    int n, k;
    cin >> n >> k;
    vector<steak> S(n);
    for(int i = 0; i < n; ++i) {
        cin >> S[i].h.first >> S[i].v.first >> S[i].h.second >> S[i].v.second;
    }
    vector<ii> Re;
    if(k == 1) Re = sol_k1(S);
    if(k == 2) Re = sol_k2(S);
    if(k == 3) Re = sol_k3(S);

    for(auto it : Re) cout << it.first << " " << it.second << "\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...