Submission #1326718

#TimeUsernameProblemLanguageResultExecution timeMemory
1326718BigBadBullyDistributing Candies (IOI21_candies)C++20
8 / 100
197 ms43000 KiB
#include "candies.h" #include <bits/stdc++.h> #define int long long #define pii pair<int,int> #define ff first #define ss second const int inf = 1e18; using namespace std; struct node{ int pref = 0,sub= 0,sum= 0,suf=0,mxp =0; node operator+(node b) { node res; res.sum = sum+b.sum; res.pref = min(pref,b.pref+sum); res.suf = min(b.suf,suf+b.sum); res.mxp=max(mxp,b.mxp+sum); res.sub = min({sub,b.sub,suf+b.pref}); return res; } }; struct seggy{ int n; vector<node> t; seggy(int sz){ n = sz; t.resize(2*n,node()); } void update(int i,int x) { node&a = t[i+=n]; a.sum = x; a.pref=min(x,0ll); a.suf = a.pref; a.sub = min(0ll,x); a.mxp = max(0ll,x); for(;i>1;i/=2) { if(i < (i^1)) t[i/2]=t[i]+t[i^1]; else t[i/2]=t[i^1]+t[i]; } } node query(int l,int r) { r++; if(l>r) return node(); node res; for(l+=n,r+=n;l<r;l/=2,r/=2) { if(l&1) res = res+t[l++]; if(r&1) res = res+t[--r]; } return res; } }; vector<signed> distribute_candies(vector<signed> c, vector<signed> l, vector<signed> r, vector<signed> v) { int n = c.size(); int q= l.size(); vector<vector<pii>> add(n),rem(n); for(int i = 0;i <q;i++) { add[l[i]].push_back({i,v[i]}); rem[r[i]].push_back({i,v[i]}); } seggy mile(q); vector<signed> ans(n); for(int i = 0; i < n; i++) { for(pii x:add[i]) mile.update(x.ff,x.ss); int idx = -1; if(-mile.query(0,q-1).sub>c[i]) { int l = 0,r = q-1; while(r-l) { int mid = (l+r+1)>>1; if(-mile.query(mid,q-1).sub > c[i]) l = mid; else r = mid-1; } idx = l; l = idx,r = q-1; while(r-l) { int mid = l+r>>1; if(-mile.query(idx,mid).sub > c[i]) r = mid; else l = mid+1; } idx = l; } node g = mile.query(idx+1,q-1); int lit = -min(0ll,g.pref); int big = max(0ll,g.mxp+lit-c[i]); ans[i] = g.sum-big+lit; for(pii x:rem[i]) mile.update(x.ff,0); } return ans; } #undef int
#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...