Submission #1059356

#TimeUsernameProblemLanguageResultExecution timeMemory
1059356TrentDistributing Candies (IOI21_candies)C++17
3 / 100
5093 ms54272 KiB
#include "candies.h" #include "bits/stdc++.h" using namespace std; #define forR(i, x) for(int i = 0; i < (x); ++i) #define REP(i, a, b) for(int i = (a); i < (b); ++i) typedef long long ll; typedef vector<int> vi; typedef vector<vi> vvi; const int MN = 2e5 + 10, ME = 4 * MN; struct node{ ll su, maI, miD; ll miP, maP, miS, maS; }; node seg[ME]; node comb(node lef, node rig) { return {lef.su + rig.su, max({lef.maI, rig.maI, lef.maS + rig.maP}), min({lef.miD, rig.miD, lef.miS + rig.miP}), min(lef.miP, lef.su + rig.miP), max(lef.maP, lef.su + rig.maP), min(rig.miS, rig.su + lef.miS), max(rig.maS, rig.su + lef.maS)}; } void upd(int v, int nl, int nr, int i, ll to) { if(nl == i && nr == i) seg[v] = {to, max(to, 0ll), min(to, 0ll), min(to, 0ll), max(to, 0ll), min(to, 0ll), max(to, 0ll)}; else { int mid = (nl+nr)/2; if(i <= mid) upd(2*v, nl, mid, i, to); else upd(2*v+1, mid+1, nr, i, to); seg[v] = comb(seg[2*v], seg[2*v+1]); } } node qu(int v, int nl, int nr, int l, int r) { if(l > r) return {0, 0, 0}; else if(nl == l && nr == r) return seg[v]; else { int mid = (nl+nr)/2; return comb( qu(2*v, nl, mid, l, min(mid, r)), qu(2*v+1, mid+1, nr, max(mid+1, l), r) ); } } std::vector<int> distribute_candies(std::vector<int> c, std::vector<int> l, std::vector<int> r, std::vector<int> v) { int n=c.size(), m=l.size(); vi ch(m); vvi addOp(n), remOp(n); forR(i, m) { addOp[l[i]].push_back(i); if(r[i] + 1 < n) remOp[r[i]+1].push_back(i); } vi ret(n); vi tested(n); forR(i, n) { for(int j : addOp[i]) { ch[j] = v[j]; upd(1, 0, m-1, j, v[j]); } for(int j : remOp[i]) { ch[j] = 0; upd(1, 0, m-1, j, 0); } // [besInd, m) has NO interval <= -c or >= c ll uc=0, dc=0; int lo=-1, hi=m; // cerr << i << ": \n"; while(hi - lo > 1) { int mid = (lo+hi)/2; node info = qu(1, 0, m-1, mid, m-1); // cout << mid << ' ' << info.su << ' ' << info.maI << ' ' << info.miD << '\n'; if(info.maI >= c[i] || info.miD <= -c[i]) { lo = mid; uc=info.maI, dc=info.miD; } else hi = mid; } int besInd = hi; // for(int j : ch) cerr << j << ' '; // cerr << '\n'; // cerr << besInd << ' ' << uc << ' ' << dc << '\n'; if(uc >= c[i]) { assert(dc >= -c[i]); int cur = c[i]; REP(j, besInd, m) { cur = min(c[i], cur + ch[j]); assert(cur >= 0); } ret[i] = cur; } else { assert(besInd == 0 || dc <= -c[i]); int cur = 0; REP(j, besInd, m) { cur = max(0, cur + ch[j]); assert(cur <= c[i]); } ret[i] = cur; } int cur = 0; forR(j, m) cur = max(0, min(c[i], cur + ch[j])); assert(cur == ret[i]); } return ret; }
#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...