Submission #1038927

#TimeUsernameProblemLanguageResultExecution timeMemory
1038927Andrey사탕 분배 (IOI21_candies)C++17
100 / 100
321 ms61784 KiB
#include "candies.h" #include<bits/stdc++.h> #include <vector> using namespace std; long long n,q; vector<pair<long long,long long>> haha[200001]; vector<pair<long long,long long>> big(1000001); vector<pair<long long,long long>> sm(1000001); vector<long long> wow(1000001); void build(long long l, long long r, long long x) { if(l == r) { big[x] = {0,l}; sm[x] = {0,-l}; return; } long long mid = (l+r)/2; build(l,mid,x*2); build(mid+1,r,x*2+1); big[x] = max(big[x*2],big[x*2+1]); sm[x] = min(sm[x*2],sm[x*2+1]); } void upd(long long l, long long r, long long ql, long long qr, long long x, long long br) { if(l == ql && r == qr) { wow[x]+=br; big[x] = {big[x].first+br,big[x].second}; sm[x] = {sm[x].first+br,sm[x].second}; return; } long long mid = (l+r)/2; if(qr <= mid) { upd(l,mid,ql,qr,x*2,br); } else if(ql > mid) { upd(mid+1,r,ql,qr,x*2+1,br); } else { upd(l,mid,ql,mid,x*2,br); upd(mid+1,r,mid+1,qr,x*2+1,br); } big[x] = max(big[x*2],big[x*2+1]); sm[x] = min(sm[x*2],sm[x*2+1]); big[x] = {big[x].first+wow[x],big[x].second}; sm[x] = {sm[x].first+wow[x],sm[x].second}; } pair<long long,long long> calc(long long l, long long r, long long ql, long long qr, long long x, bool y) { if(ql > qr) { return {0,-1}; } if(l == ql && r == qr) { if(y) { return big[x]; } else { return sm[x]; } } long long mid = (l+r)/2; pair<long long,long long> ans; if(qr <= mid) { ans = calc(l,mid,ql,qr,x*2,y); } else if(ql > mid) { ans = calc(mid+1,r,ql,qr,x*2+1,y); } else { pair<long long,long long> a = calc(l,mid,ql,mid,x*2,y); pair<long long,long long> b = calc(mid+1,r,mid+1,qr,x*2+1,y); if(y) { ans = max(a,b); } else { ans = min(a,b); } } ans = {ans.first+wow[x],ans.second}; return ans; } long long dude(long long l, long long r, long long x, long long c, long long big1, long long sm1, long long d) { if(l == r) { big1 = max(big1,big[x].first+d); sm1 = min(sm1,sm[x].first+d); if(big1-sm1 >= c) { return l-1; } else { return l; } } d+=wow[x]; int mid = (l+r)/2; long long big2 = max(big1,big[x*2].first+d); long long sm2 = min(sm1,sm[x*2].first+d); if(big2-sm2 < c) { return dude(mid+1,r,x*2+1,c,big2,sm2,d); } else { return dude(l,mid,x*2,c,big1,sm1,d); } } vector<int> distribute_candies(vector<int> c, vector<int> l, vector<int> r, vector<int> v) { n = c.size(); q = l.size(); for(long long i = 0; i < q; i++) { haha[l[i]].push_back({v[i],q+1-i}); haha[r[i]+1].push_back({-v[i],q+1-i}); } q++; build(1,q,1); vector<int> ans(n); for(long long i = 0; i < n; i++) { for(pair<long long,long long> v: haha[i]) { upd(1,q,v.second,q,1,v.first); } long long p = dude(1,q,1,c[i],0,0,0); if(p == q) { ans[i] = calc(1,q,1,q,1,1).first; } else { p++; pair<long long,long long> a = calc(1,q,1,p,1,1); pair<long long,long long> b = calc(1,q,1,p,1,0); b = {b.first,-b.second}; if(b.second > a.second) { ans[i] = a.first; } else { ans[i] = c[i]+b.first; } } } return ans; }
#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...