Submission #1279123

#TimeUsernameProblemLanguageResultExecution timeMemory
1279123duckindogRoad Construction (JOI21_road_construction)C++20
100 / 100
1416 ms14372 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long

const int N = 250'000 + 10;
int n, k;
pair<int, int> p[N];

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

    cin >> n >> k;
    for (int i = 1; i <= n; ++i) { 
        int x, y; cin >> x >> y;
        p[i].first = x - y;
        p[i].second = x + y;
    }
    sort(p + 1, p + n + 1);

    vector<int> answer;

    multiset<pair<int, int>> s;
    auto chk = [&](int mid, bool doTrace) { 
        s.clear();
        int cnt = 0;
        for (int i = 1, j = 1; i <= n; ++i) { 
            const auto& [x, y] = p[i];
            for (; x - p[j].first > mid; ++j) s.erase({p[j].second, j});

            auto it = s.lower_bound({y - mid, 0});
            for (; it != s.end() && it->first <= y + mid; ++it) { 
                cnt += 1;

                if (doTrace) { 
                    int j = it->second;
                    answer.push_back(max(abs(x - p[j].first), abs(y - p[j].second)));
                }
                if (!doTrace && cnt == k) return true;
            }
    
            s.insert({p[i].second, i});
        }
        return false;
    };
    int l = 0, r = 4'000'000'000, ret = -1;
    while (l <= r) { 
        int mid = (l + r) >> 1;
        if (chk(mid, false)) r = mid - 1, ret = mid;
        else l = mid + 1;
    }
    
    chk(ret, true);

    sort(answer.begin(), answer.end());
    for (int i = 0; i < k; ++i) cout << answer[i] << "\n";
}
#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...