Submission #229704

#TimeUsernameProblemLanguageResultExecution timeMemory
229704monus1042Rice Hub (IOI11_ricehub)C++17
100 / 100
29 ms2560 KiB
#include <bits/stdc++.h> #include "ricehub.h" using namespace std; #define ll long long int besthub(int R, int L, int X[], long long B) { int ans=1; ll cost=0; ll pref[R]; for (ll i=0; i<R; i++){ if (!i) pref[i] = X[i]; else pref[i] = pref[i-1] + X[i]; } ll l=R-1; for (int i=R-2; ~i; i--){ if (cost + (ll)(X[R-1] - X[i]) <= B){ l--; cost+=(ll)(X[R-1] - X[i]); ans++; }else break; } for (ll i=R-2; ~i; i--){ ll dist=X[i+1] - X[i]; if (l>i){ l=i; }else{ cost -= dist * (i+1-l); } ll lo=i, hi=R; while(lo+1!=hi){ ll en=(lo + hi)/2; ll cost2=pref[en] - pref[i] - (en-i)*(ll)X[i]; if (cost + cost2 <= B) lo=en; else hi=en; } int currans=lo-l+1; ll currcost = cost + pref[lo] - pref[i] - (lo-i)*(ll)(X[i]); int newl=l; //bool ok=0; ll auxcost=cost; //while(1){ //if (ok) break; if (newl - 1 >= 0){ while(1){ if (newl - 1 >= 0 && auxcost + (X[i] - X[newl-1]) <= B){ newl--; auxcost += (ll)(X[i] - X[newl]); ll lo1=i, hi1=R; while(lo1+1!=hi1){ ll en=(lo1 + hi1)/2; ll cost2=pref[en] - pref[i] - (en-i)*(ll)X[i]; if (auxcost + cost2 <= B) lo1=en; else hi1=en; } ll cans = lo1 - newl + 1; ll ccost= auxcost + pref[lo1] - pref[i] - (lo1-i)*(ll)(X[i]); if (cans == currans && ccost <= currcost){ currcost = ccost; l=newl; cost = auxcost; }else if (cans > currans){ currcost=ccost; currans = cans; l=newl; cost=auxcost; }else{ break; } }else{ break; } } } //} ans=max(ans, currans); } 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...