Submission #1324296

#TimeUsernameProblemLanguageResultExecution timeMemory
1324296duckindogHamburg Steak (JOI20_hamburg)C++20
2 / 100
253 ms8760 KiB
#include <algorithm>
#include <bits/stdc++.h>

using namespace std;

const int N = 400'000 + 10;
int n, k;
pair<int, int> buga[N][2];

vector<int> save[N];

int32_t main() { 
    cin.tie(0)->sync_with_stdio(0);

    cin >> n >> k;
    for (int i = 1; i <= n; ++i) { 
        cin >> buga[i][0].first >> buga[i][1].first;
        cin >> buga[i][0].second >> buga[i][1].second;
    }

    array<vector<int>, 2> arr;
    for (int dir = 0; dir < 2; ++dir) { 
        vector<int> allP;
        for (int i = 1; i <= n; ++i) { 
            const auto& [l, r] = buga[i][dir];
            allP.push_back(l);
            allP.push_back(r);
        }
        sort(allP.begin(), allP.end());
        allP.erase(unique(allP.begin(), allP.end()), allP.end());

        using pii = pair<int, int>;
        priority_queue<pii, vector<pii>, greater<>> pq;
        for (int i = 1; i <= n; ++i) { 
            auto [l, r] = buga[i][dir];

            l = lower_bound(allP.begin(), allP.end(), l) - allP.begin();
            r = lower_bound(allP.begin(), allP.end(), r) - allP.begin();
            pq.push({r, l});
        }

        vector<int> vt;
        while (pq.size()) { 
            auto [r, l] = pq.top(); pq.pop();
            if (vt.size() && l <= vt.back()) continue;
            vt.push_back(r);
        }

        for (const auto& x : vt) arr[dir].push_back(allP[x]);
        if (!arr[dir].size()) arr[dir].push_back(1);
    }
    assert((int)(arr[0].size() * arr[1].size()) <= k);
    
    vector<pair<int, int>> answer;

    for (const auto& x : arr[0]) { 
        for (const auto& y : arr[1]) { 
            cout << x << " " << y << "\n";
            k -= 1;

            answer.push_back({x, y});
        }
    }
    while (k--) {
        cout << 1 << " " << 1 << "\n";
        answer.push_back({1, 1});
    }

    for (int i = 1; i <= n; ++i) { 
        bool found = false;
        auto [l, r] = buga[i][0];
        auto [d, u] = buga[i][1];
        for (const auto& [x, y] : answer) { 
            if (l <= x && x <= r && d <= y && y <= u) { 
                found = true;
                break;
            }
        }
        assert(found);
    }
}
#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...