Submission #386442

#TimeUsernameProblemLanguageResultExecution timeMemory
386442rocks03Road Construction (JOI21_road_construction)C++14
100 / 100
3961 ms13028 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long #define pii pair<int, int> #define pll pair<ll, ll> #define ff first #define ss second #define pb push_back #define SZ(x) ((int)(x).size()) #define all(x) x.begin(), x.end() #define debug(x) cout << #x << ": " << x << " " #define nl cout << "\n" #define rep(i, a, b) for(int i = (a); i < (b); i++) #define per(i, a, b) for(int i = (a); i >= (b); i--) mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); class FenwickTree{ public: vector<int> fen; int bitsz; void build(int n){ bitsz = n + 10; fen = vector<int>(bitsz, 0); } void add(int i, int k){ ++i; for(; i < bitsz; i += (i & -i)) fen[i] += k; } int get(int i){ ++i; int s = 0; for(; i; i -= (i & -i)) s += fen[i]; return s; } int get(int l, int r){ return get(r) - get(l - 1); } } bit; const int MAXN = 3e5+100; int N, K; pll a[MAXN]; vector<ll> c; bool check(ll mid){ bit.build(N); int j = 0; ll ans = 0; rep(i, 0, N){ while(a[i].ff - a[j].ff > mid){ bit.add(a[j].ss, -1); j++; } int l = lower_bound(all(c), c[a[i].ss] - mid) - c.begin(); int r = upper_bound(all(c), c[a[i].ss] + mid) - c.begin() - 1; ans += bit.get(l, r); bit.add(a[i].ss, +1); } return (ans >= K); } void print_answer(ll mid){ vector<ll> answer; set<pii> s; int j = 0; rep(i, 0, N){ while(a[i].ff - a[j].ff > mid){ s.erase({a[j].ss, j}); j++; } int l = lower_bound(all(c), c[a[i].ss] - mid) - c.begin(); int r = upper_bound(all(c), c[a[i].ss] + mid) - c.begin() - 1; auto it = s.lower_bound({l, -1}); while(it != s.end()){ if((*it).ff > r) break; answer.pb(max(a[i].ff - a[(*it).ss].ff, abs(c[(*it).ff] - c[a[i].ss]))); ++it; } s.insert({a[i].ss, i}); } while(SZ(answer) < K) answer.pb(mid + 1); sort(all(answer)); rep(i, 0, K) cout << answer[i] << "\n"; } void solve(){ cin >> N >> K; rep(i, 0, N){ int x, y; cin >> x >> y; a[i] = {x - y, x + y}; c.pb(x + y); } sort(all(c)); c.resize(unique(all(c)) - c.begin()); rep(i, 0, N){ a[i].ss = lower_bound(all(c), a[i].ss) - c.begin(); } sort(a, a + N); ll l = 0, r = 1e11; while(r - l > 1){ ll mid = (l + r) / 2; if(check(mid)){ r = mid; } else{ l = mid; } } print_answer(l); } int main(){ ios_base::sync_with_stdio(false), cin.tie(nullptr); solve(); 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...