Submission #1315779

#TimeUsernameProblemLanguageResultExecution timeMemory
1315779vlomaczkRoad Construction (JOI21_road_construction)C++20
7 / 100
9144 ms29788 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> typedef long long ll; using namespace __gnu_pbds; using namespace std; template <typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; template <typename TY> struct MultiOrderedSet { ordered_set<pair<TY, int>> os; int cnt = 0; void insert(TY x) { os.insert({x, cnt++}); } void erase(TY x) { int i = os.order_of_key({x,-1}); assert(i < os.size()); os.erase(*os.find_by_order(i)); } TY first() { return os.begin()->first; } TY last() { return os.rbegin()->first; } void clear() { while(os.size()) os.erase(*os.begin()); } int size() { return os.size(); } bool empty() { return os.empty(); } int order_of_key(TY x) { return os.order_of_key({x, -1}); } TY find_by_order(ll x) { return os.find_by_order(x)->first; } ll amount(ll a, ll b) { return order_of_key(b+1) - order_of_key(a); } }; struct Point { ll x, y; friend bool operator<(Point a, Point b) { return a.y < b.y; } }; ll M = 250'010; vector<ll> cnt(M,1); ll n; ll inf = 1e18; vector<Point> pkt; vector<ll> X, Y; ll base = 1<<18; ll numer = 1; vector<ll> dists; ll count(ll d) { vector<pair<ll, ll>> sweep; for(int i=0; i<n; ++i) { sweep.push_back({pkt[i].y - d - 1, i}); sweep.push_back({pkt[i].y, i}); } MultiOrderedSet<ll> mos; ll sum = 0; sort(sweep.begin(), sweep.end()); for(auto[poz, i] : sweep) { if(pkt[i].y > poz) { sum -= mos.amount(pkt[i].x-d, pkt[i].x+d); } else { sum += mos.amount(pkt[i].x-d, pkt[i].x+d); mos.insert(pkt[i].x); } } return sum; } vector<ll> get_dists(ll d) { vector<ll> dists; return dists; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll k; cin >> n >> k; pkt.resize(n); for(ll i=0; i<n; ++i) { ll x,y; cin >> x >> y; pkt[i] = {x+y,x-y}; } sort(pkt.begin(), pkt.end()); ll lo = 0; ll hi = 4e9; while(lo < hi) { ll mid = (lo+hi)/2; if(count(mid) < k) lo = mid+1; else hi = mid; } cout << lo << "\n"; vector<ll> dists = get_dists(lo); sort(dists.begin(), dists.end()); // for(int i=0; i<k; ++i) cout << dists[i] << " "; cout << "\n"; return 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...