Submission #435921

#TimeUsernameProblemLanguageResultExecution timeMemory
435921dqhungdlDistributing Candies (IOI21_candies)C++17
0 / 100
151 ms12088 KiB
#include "candies.h" #include <bits/stdc++.h> using namespace std; 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=v.size(); vector<long long> S(m+1),Smin(m+1),Smax(m+1); for(int i=m-1;i>=0;i--) { S[i]=S[i+1]+v[i]; Smin[i]=min(Smin[i+1],S[i]); Smax[i]=max(Smax[i+1],S[i]); } vector<int> rs(n); for(int i=0;i<n;i++) { int l=0,r=m-1,pivot=-1; while(l<=r) { int mid=(l+r)/2; if(Smax[mid]-Smin[mid]>c[i]) { pivot=mid; l=mid+1; } else r=mid-1; } // All updates are in range if(pivot==-1) { rs[i]=S.back(); continue; } // Find the last time touching the upper wall if(Smax[pivot]==S[pivot]) { l=pivot+1,r=m; while(l<=r) { int mid=(l+r)/2; if(Smin[mid]==Smin[pivot]) { pivot=mid; l=mid+1; } else r=mid-1; } l=pivot,r=m-1; while(l<=r) { int mid=(l+r)/2; if(Smax[mid]>c[i]) { pivot=mid; l=mid+1; } else r=mid-1; } rs[i]=c[i]+S[pivot]; } else { // Find the last time touching the lower wall l=pivot,r=m; while(l<=r) { int mid=(l+r)/2; if(Smax[mid]==Smax[pivot]) { pivot=mid; l=mid+1; } else r=mid-1; } l=pivot,r=m-1; while(l<=r) { int mid=(l+r)/2; if(Smin[mid]<0) { pivot=mid; l=mid+1; } else r=mid-1; } rs[i]=S[pivot]; } } return rs; }
#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...