Submission #1156031

#TimeUsernameProblemLanguageResultExecution timeMemory
1156031ace5Distributing Candies (IOI21_candies)C++20
100 / 100
1091 ms31548 KiB
#include "candies.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 200005; const ll INF = 1e18; pair<ll,ll> segTree[4*maxn]; ll p[4*maxn]; void push(int l,int r,int indV) { segTree[indV].first += p[indV]; segTree[indV].second += p[indV]; if(l != r) { p[indV*2+1] += p[indV]; p[indV*2+2] += p[indV]; } p[indV] = 0; return ; } void modify(int lx,int rx,ll x,int l,int r,int indV) { push(l,r,indV); if(l > rx || r < lx) return ; else if(l >= lx && r <= rx) { p[indV] += x; push(l,r,indV); return ; } int m = (l+r)/2; modify(lx,rx,x,l,m,indV*2+1); modify(lx,rx,x,m+1,r,indV*2+2); segTree[indV] = {min(segTree[indV*2+1].first,segTree[indV*2+2].first),max(segTree[indV*2+1].second,segTree[indV*2+2].second)}; return ; } pair<ll,ll> get(int lx,int rx,int l,int r,int indV) { push(l,r,indV); if(l > rx || r < lx) return {INF,-INF}; else if(l >= lx && r <= rx) return segTree[indV]; int m = (l+r)/2; pair<ll,ll> sl = get(lx,rx,l,m,indV*2+1); pair<ll,ll> sr = get(lx,rx,m+1,r,indV*2+2); return {min(sl.first,sr.first),max(sl.second,sr.second)}; } vector<int> distribute_candies(vector<int> c, vector<int> l, vector<int> r, vector<int> v) { int n = c.size(); int q = l.size(); vector<vector<pair<int,int>>> ev(n+1); for(int j = 0;j < q;++j) { ev[l[j]].push_back({v[j],j+1}); ev[r[j]+1].push_back({-v[j],j+1}); } vector<int> s(n); ll sum = 0; for(int j = 0;j < n;++j) { for(int k = 0;k < ev[j].size();++k) { modify(ev[j][k].second,q,ev[j][k].first,0,q,0); sum += ev[j][k].first; } push(0,q,0); if(segTree[0].second - segTree[0].first < c[j]) { s[j] = sum - segTree[0].first; } else { int lg = 0,rg = q; while(lg < rg) { int mg = (lg+rg)/2; pair<ll,ll> cc = get(mg,q,0,q,0); if(cc.second-cc.first >= c[j]) { lg = mg + 1; } else rg = mg; } pair<ll,ll> cx = get(lg,q,0,q,0); pair<ll,ll> cxd = get(lg-1,q,0,q,0); if(cxd.first == cx.first) { s[j] = sum - cx.first; } else s[j] = sum - cx.second + c[j]; } } return s; }
#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...