Submission #558847

#TimeUsernameProblemLanguageResultExecution timeMemory
558847teraqqqDistributing Candies (IOI21_candies)C++17
3 / 100
5063 ms27948 KiB
#include "candies.h" #include <iostream> #include <vector> using namespace std; using vi = vector<int>; using ll = long long; const ll LINF = 1e18; const int N = 2e5+7; int n; pair<ll, int> tmin[4*N]; ll tadd[4*N]; struct SegmentTreeMin { void build(int v, int vl, int vr, const vector<int>& w) { tadd[v] = 0; if (vl + 1 == vr) { tmin[v] = { w[vl], vl }; } else { int vm = (vl + vr) / 2; build(2*v, vl, vm, w); build(2*v+1, vm, vr, w); tmin[v] = min(tmin[2*v], tmin[2*v+1]); } } void build(const vector<int>& w) { build(1, 0, n, w); } void add(int v, int vl, int vr, int l, int r, ll x) { if (l <= vl && vr <= r) { tadd[v] += x; tmin[v].first += x; } else if (r <= vl || vr <= l) { /* nope :D */ } else { int vm = (vl + vr) / 2; add(2*v, vl, vm, l, r, x); add(2*v+1, vm, vr, l, r, x); tmin[v] = min(tmin[2*v], tmin[2*v+1]); tmin[v].first += tadd[v]; } } void add(int l, int r, ll x) { add(1, 0, n, l, r, x); } pair<ll, int> query() { return tmin[1]; } } sgt; vi distribute_candies(vi c, vi l, vi r, vi v) { const int q = v.size(); n = c.size(); for (int& x : r) ++x; vector<int> ans_l(n), ans_r(n); for (int i = n; i--; ) ans_r[i] = c[i] + 1; vector<int> lb_out(n), ub_out(n), ub_outh(n); vector<ll> lb_outx(n), ub_outx(n); for (int iter = 30; iter--; ) { vector<int> wlb(n), wrb(n); for (int i = n; i--; ) { wlb[i] = (ans_l[i] + ans_r[i]) / 2; wrb[i] = c[i] - wlb[i]; } sgt.build(wlb); fill(lb_out.begin(), lb_out.end(), -1); fill(ub_out.begin(), ub_out.end(), -1); fill(ub_outh.begin(), ub_outh.end(), -1); sgt.build(wlb); for (int j = q; j >= 0; j--) { if (j != q) sgt.add(l[j], r[j], -v[j]); while (true) { const auto [val, i] = sgt.query(); if (val > 0) break; lb_outx[i] = val; lb_out[i] = j; sgt.add(i, i+1, LINF); } } sgt.build(wrb); for (int j = q; j >= 0; j--) { if (j != q) sgt.add(l[j], r[j], +v[j]); while (true) { const auto [val, i] = sgt.query(); if (val > 0) break; ub_outx[i] = val; ub_out[i] = j; sgt.add(i, i+1, LINF); } } sgt.build(wrb); for (int j = q; j >= 0; j--) { if (j != q) sgt.add(l[j], r[j], +v[j]); while (true) { const auto [val, i] = sgt.query(); if (val >= 0) break; ub_outh[i] = j; sgt.add(i, i+1, LINF); } } for (int i = 0; i < n; ++i) { if (lb_out[i] == -1 && ub_out[i] == -1) { ans_r[i] = wlb[i]; } else { if (lb_out[i] > ub_out[i]) { ans_l[i] = wlb[i]; } else { if (ub_outx[i] == 0) { if (lb_out[i] > ub_outh[i]) { ans_l[i] = wlb[i]; } else { ans_r[i] = wlb[i]; } } else { ans_r[i] = wlb[i]; } } } } } return ans_l; }
#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...