Submission #1213014

#TimeUsernameProblemLanguageResultExecution timeMemory
1213014vincentbucourt1Rice Hub (IOI11_ricehub)C++20
100 / 100
160 ms2392 KiB
#include "ricehub.h" #include <bits/stdc++.h> using namespace std; #define ll long long int N; vector<ll> vals; vector<ll> prefSum; ll ans = 0; ll cost (int lb, int ub, int idx) { return (prefSum[ub] - prefSum[idx]) - vals[idx]*(ub - idx) + vals[idx]*(idx + 1 - lb) - (prefSum[idx+1] - prefSum[lb]); } ll test (int idx, ll len) { int lb = lower_bound(vals.begin(), vals.end(), vals[idx] - len) - vals.begin(); int ub = upper_bound(vals.begin(), vals.end(), vals[idx] + len) - vals.begin(); return cost(lb, ub, idx); } int besthub(int R, int L, int X[], long long B) { N = R; vals.resize(N); prefSum.assign(N+1, 0); for (int i = 0; i < N; i++) { vals[i] = X[i]; prefSum[i+1] = vals[i] + (i > 0 ? prefSum[i] : 0); } for (int idx = 0; idx < N; idx++) { ll lo = 0, hi = L+20; while (hi - lo > 1) { int mid = lo + (hi - lo) / 2; if (test(idx, mid) <= B) { lo = mid; } else { hi = mid; } } ll lb = lower_bound(vals.begin(), vals.end(), vals[idx] - lo) - vals.begin(); ll ub = upper_bound(vals.begin(), vals.end(), vals[idx] + lo) - vals.begin(); ll numClose = (lb > 0 ? lb - (lower_bound(vals.begin(), vals.end(), vals[lb-1]) - vals.begin()) : 0); ll len = (lb > 0 ? vals[idx] - vals[lb-1] : 1); if (ub < N-1 && lb > 0 && vals[ub] - vals[idx] < vals[idx] - vals[lb-1]) { numClose = 0; } if (ub < N-1 && (lb == 0 || vals[ub] - vals[idx] <= vals[idx] - vals[lb-1])) { len = vals[ub] - vals[idx]; numClose += (ub < N-1 ? upper_bound(vals.begin(), vals.end(), vals[ub]) - vals.begin() - 1 - ub : 0); } ll res = ub - lb + min(numClose, (B - cost(lb, ub, idx))/len); ans = max(ans, res); } 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...