# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1252665 | pvb.tunglam | 쌀 창고 (IOI11_ricehub) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#define hash _hash_
#define y1 _y1_
#define left _left_
#define right _right_
#define dec _dec_
#define int long long
using namespace std;
/*------------- I alone decide my fate! --------------*/
/* Across the silent paddies, carts will roll… */
static const int MAXR = 100000 + 5;
static long long pref[MAXR];
// Chú ý: X là mảng (int X[]), B là long long
long long besthub(int R, int /*L*/, int X[], long long B) {
// Tính pref[i] = X[0] + ... + X[i]
for (int i = 0; i < R; ++i) {
pref[i] = X[i] + (i ? pref[i-1] : 0);
}
auto sum = [&](int l, int r) -> long long {
if (l > r) return 0;
return pref[r] - (l ? pref[l-1] : 0);
};
int ans = 0, l = 0;
for (int r = 0; r < R; ++r) {
// Đẩy l lên cho tới khi cost(l,r) <= B
while (l <= r) {
int m = (l + r) >> 1;
long long leftCnt = m - l;
long long rightCnt = r - m;
long long cost =
leftCnt * X[m] - sum(l, m - 1)
+ sum(m + 1, r) - rightCnt * X[m];
if (cost <= B) break;
++l;
}
ans = max(ans, r - l + 1);
}
return ans;
}
/*
…For we have placed the hub where numbers told.
*/