Submission #870131

#TimeUsernameProblemLanguageResultExecution timeMemory
870131NK_Road Construction (JOI21_road_construction)C++17
100 / 100
4267 ms27184 KiB
// Success consists of going from failure to failure without loss of enthusiasm #include <bits/stdc++.h> using namespace std; #define nl '\n' #define pb push_back #define pf push_front #define mp make_pair #define f first #define s second #define sz(x) int(x.size()) template<class T> using V = vector<T>; using pi = pair<int, int>; using vi = V<int>; using vpi = V<pi>; using ll = long long; using pl = pair<ll, ll>; using vpl = V<pl>; using vl = V<ll>; using db = long double; using str = string; #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; template<class T> using pq = priority_queue<T, V<T>, greater<T>>; template<class T> using iset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; const int MOD = 1e9 + 7; const ll INFL = ll(1e17); const int LG = 19; int main() { cin.tie(0)->sync_with_stdio(0); // rotate 45 (x, y) -> (x + y, x - y) // Change Manhattan Distance to C. Distance (max(∆x, ∆y)) int N, K; cin >> N >> K; vpl A(N); for(auto& x : A) cin >> x.f >> x.s; for(auto& x : A) x = mp(x.f + x.s, x.f - x.s); sort(begin(A), end(A)); V<array<ll, 3>> R; for(int i = 0; i < N; i++) { int j = i; while(j < N && A[i].f == A[j].f) j++; R.pb(array<ll, 3>{A[i].f, i, j - 1}); i = j - 1; } int M = sz(R); auto dist = [&](const pl &a, const pl &b) -> ll { return max(abs(a.f - b.f), abs(a.s - b.s)); }; iset<pl> B; vl ANS; auto get = [&](ll d, int t) { // d -> distance within // t -> get pairs B = {}; ll ans = 0; vl res; for(int l = 0, r = 0; r < M; r++) { // REM l(s) while(l <= r && (R[r][0] - R[l][0]) > d) { for(int i = R[l][1]; i <= R[l][2]; i++) B.erase(mp(A[i].s, i)); l++; } // ADD r + COUNT PAIRS (for people in r); for(int i = R[r][1]; i <= R[r][2]; i++) { B.insert(mp(A[i].s, i)); int li = B.order_of_key(mp(A[i].s - d, -MOD)); int ri = B.order_of_key(mp(A[i].s + d, MOD)) - 1; ans += ri - li; if (t) for(int x = li; x <= ri; x++) { int j = (*B.find_by_order(x)).s; if (i == j) continue; res.pb(dist(A[i], A[j])); } } } if (t) ANS = res; return ans; }; ll lo = 0, hi = 5LL * MOD; while(lo < hi) { ll mid = (lo + hi) / 2; if (get(mid, 0) > K) hi = mid; else lo = mid + 1; } get(lo - 1, 1); sort(begin(ANS), end(ANS)); while(sz(ANS) < K) ANS.pb(lo); for(auto& x : ANS) cout << x << nl; exit(0-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...