제출 #830198

#제출 시각아이디문제언어결과실행 시간메모리
830198OAleksa쌀 창고 (IOI11_ricehub)C++14
68 / 100
10 ms1076 KiB
#include <bits/stdc++.h> #include "ricehub.h" #define f first #define s second using namespace std; int besthub(int R, int L, int X[], long long B) { int n = R; int a[n]; for(int i = 0;i < n;i++) a[i] = X[i]; int ans = 1; int l = 0, r = 0; const int inf = 1e9 + 69; long long t = 0; while(r < n - 1 && t + a[r + 1] - a[0] <= B) { ++r; t += (a[r] - a[0]); ++ans; } for(int i = 1;i < n;i++) { if(i > r) { l = r = i; t = 0; while(r < n - 1 && t + a[r + 1] - a[i] <= B) { ++r; t += (a[r] - a[i]); } } else { t -= (r - i + 1) * (a[i] - a[i - 1]); t += (i - l) * (a[i] - a[i - 1]); while(t > B) { if(a[i] - a[l] >= a[r] - a[i]) t -= (a[i] - a[l++]); else t -= (a[r--] - a[i]); } while(t <= B) { int x1 = inf, x2 = inf, y1 = inf, y2 = inf; x1 = a[i] - a[l]; y1 = a[r] - a[i]; if(l > 0) x2 = a[i] - a[l - 1]; if(r < n - 1) y2 = a[r + 1] - a[i]; if(x2 == inf && y2 == inf) break; if(y2 < x1) { t += y2 - x1; ++r, ++l; } else if(x2 < y1) { t += x2 - y1; --l, --r; } else break; } while(t <= B) { int x = inf, y = inf; if(l > 0) x = a[i] - a[l - 1]; if(r < n - 1) y = a[r + 1] - a[i]; if(t + x > B) x = inf; if(t + y > B) y = inf; if(x == inf && y == inf) break; if(x <= y) t += x, --l; else t += y, ++r; } } ans = max(ans, r - l + 1); } return ans; } // signed main() // { // ios_base::sync_with_stdio(false); // cin.tie(0); // cout.tie(0); // int tt = 1; // //cin >> tt; // while(tt--) { // int n, k; // long long x; // cin >> n >> k >> x; // int a[n]; // for(int i = 0;i < n;i++) // cin >> a[i]; // cout << besthub(n, k, a, x); // } // return 0; // }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...