제출 #872718

#제출 시각아이디문제언어결과실행 시간메모리
872718serifefedartarRoad Construction (JOI21_road_construction)C++17
100 / 100
5973 ms34892 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace std; using namespace __gnu_pbds; #define fast ios::sync_with_stdio(0);cin.tie(0); #define s second #define f first typedef long long ll; const ll MOD = 1e9+9; const ll LOGN = 20; const ll MAXN = 2e5 + 100; #define int long long vector<pair<int,int>> pnt; vector<pair<int, pair<int,int>>> v; vector<ll> ans; ll N, K; int manh(int i, int j) { return max(abs(pnt[i].f - pnt[j].f), abs(pnt[i].s - pnt[j].s)); } bool check(ll mid, int type) { ll q = (ll)v.size(), r = 0; ll cnt = 0; tree<pair<ll,ll>, null_type, less<pair<ll,ll>>, rb_tree_tag, tree_order_statistics_node_update> oset; for (int l = 0; l < q; l++) { while (r + 1 < q && v[r+1].f - v[l].f <= mid) { r++; for (int i = v[r].s.f; i <= v[r].s.s; i++) oset.insert({pnt[i].s, i}); } for (int i = v[l].s.f; i <= v[l].s.s; i++) oset.erase({pnt[i].s, i}); for (int i = v[l].s.f; i <= v[l].s.s; i++) { oset.insert({pnt[i].s, i}); ll lPtr = oset.order_of_key(make_pair(pnt[i].s - mid, -1)); ll rPtr = oset.order_of_key(make_pair(pnt[i].s + mid, 1e8)) - 1; cnt += rPtr - lPtr; if (type) { for (int j = lPtr; j <= rPtr; j++) { int no = (*oset.find_by_order(j)).s; if (no != i) ans.push_back(manh(i, no)); } } } for (int i = v[l].s.f; i <= v[l].s.s; i++) oset.erase({pnt[i].s, i}); } return (cnt >= K); } signed main() { fast cin >> N >> K; pnt = vector<pair<int,int>>(N); for (int i = 0; i < N; i++) { cin >> pnt[i].f >> pnt[i].s; int x = pnt[i].f + pnt[i].s; int y = pnt[i].f - pnt[i].s; pnt[i] = {x, y}; } sort(pnt.begin(), pnt.end()); for (int i = 0; i < N; i++) { int j = i; while (j < N && pnt[i].f == pnt[j].f) j++; v.push_back({pnt[i].f, {i, j-1}}); i = j-1; } ll L = 1; ll R = 1e10; ll res = -1; while (R >= L) { ll mid = L + (R-L)/2; if (check(mid, 0)) { R = mid - 1; res = mid; } else L = mid + 1; } check(res, 1); sort(ans.begin(), ans.end()); for (int i = 0; i < K; i++) cout << ans[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...