제출 #168928

#제출 시각아이디문제언어결과실행 시간메모리
168928AlexLuchianov쌀 창고 (IOI11_ricehub)C++14
0 / 100
405 ms3064 KiB
#include "ricehub.h" using ll = long long; #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #define MAX(a, b) (((a) < (b)) ? (b) : (a)) int const nmax = 100000; int v[1 + nmax], n; ll sum[1 + nmax]; ///returns position of the last farm with coordinate lower (or equal) than target int lowerthan(int target){ int x = 0; for(int jump = (1 << 20); 0 < jump; jump /= 2) if(x + jump <= n && v[x + jump] <= target) x += jump; return x; } int tryit(int pos, int dist, ll budget){ int pos2 = lowerthan(v[pos] + dist), pos3 = lowerthan(v[pos] - dist - 1) + 1; int result = ((sum[pos2] - sum[pos - 1]) - (pos2 - pos + 1) * v[pos]); int result2 = (pos - pos3 + 1) * v[pos] - (sum[pos] - sum[pos3 - 1]); return result + result2 <= budget; } int solve(int pos, ll budget){ int dist = 0; for(int jump = (1 << 30); 0 < jump; jump /= 2){ if(tryit(pos, dist + jump, budget)) dist += jump; } dist++; int pos2 = lowerthan(v[pos] + dist), pos3 = lowerthan(v[pos] - dist - 1) + 1; int result = ((sum[pos2] - sum[pos - 1]) - (pos2 - pos + 1) * v[pos]); int result2 = (pos - pos3 + 1) * v[pos] - (sum[pos] - sum[pos3 - 1]); result = result + result2; return (pos2 - pos3 + 1) - 1 - (result - budget + 1) / dist; } int besthub(int R, int L, int X[], long long B) { n = R; for(int i = 1;i <= n; i++) v[i] = X[i - 1]; for(int i = 1;i <= n; i++) sum[i] = sum[i - 1] + v[i]; int result = 0; for(int i = 1;i <= n; i++) { int result2 = solve(i, B); result = MAX(result, result2); } return result; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...