제출 #770923

#제출 시각아이디문제언어결과실행 시간메모리
770923joshuaZRoad Construction (JOI21_road_construction)C++17
0 / 100
705 ms13284 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,ll> pll; const int mxN = 250002; int n, k; ll path[4 * mxN]; pll a[mxN]; bool solve(ll d){ set<pll> st; int c = 1; for (int i = 1, j = 1; i <= n; i++){ while (a[i].first - a[j].first > d){ st.erase({a[j].second, a[j].first}); j++; } auto l = st.lower_bound({a[i].second - d, -1e10}); auto r = st.upper_bound({a[i].second + d, -1e10}); for (auto it = l; it != r; it++){ path[c] = max(abs((*it).first - a[i].second), abs((*it).second - a[i].first)); if (++c >= 4 * mxN){ return true; } } st.insert({a[i].second, a[i].first}); } if (c >= k){ return true; } else { return false; } } int main(){ ios::sync_with_stdio(0); cin.tie(0); cin >> n >> k; //xi + yi - (xj + yj) <= val //xi - yi - (xj - yj) <= val for (int i = 1; i <= n; i++){ ll x, y; cin >> x >> y; a[i].first = x + y; a[i].second = x - y; } sort(a + 1, a + 1 + n); ll lo = 1, hi = 5e9, ans = -1; while (lo <= hi){ ll mid = lo + (hi - lo) / 2; if (solve(mid)){ ans = mid; hi = mid - 1; } else { lo = mid + 1; } } solve(ans); sort(path + 1, path + 1 + k); for (int i = 1; i <= k; i++){ cout << path[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...