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...