# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1104376 | M_W_13 | 쌀 창고 (IOI11_ricehub) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include "ricehub.h"
using namespace std;
typedef long long ll;
#define rep(i, n) for (ll i = 0; i < (n); i++)
ll besthub(ll R, ll L, ll X[], ll B)
{
ll n = R;
ll T[n];
rep(i, n) {
T[i] = X[i];
}
ll ans = 0;
queue<ll> q;
ll ile1 = 0;
ll ile2 = 0;
ll poz = 0;
ll it = 0;
ll S = 0;
while (it < n && S + T[it] <= B) {
S += T[it];
q.push(T[it]);
ile2++;
it++;
}
ans = max(ans, ile1 + ile2);
rep(i, n) {
S -= (ile2 * (T[i] - poz));
S += (ile1 * (T[i] - poz));
ile1++;
ile2--;
poz = T[i];
// cout << "i = " << i << " poz = " << poz << endl;
// cout << "ile1 = " << ile1 << " ile2 = " << ile2 << endl;
// cout << "S = " << S << endl;
while (S > B) {
ll x = q.front();
q.pop();
S -= (T[i] - x);
ile1--;
}
while (true) {
// cout << "QQQQQQQ = " << q.front() << '\n';
if ((it >= n || S + (T[it] - poz) > B) && (it >= n || ((T[it] - poz) >= (poz - q.front())))) {
break;
}
if (S + (T[it] - poz) <= B) {
S += (T[it] - poz);
q.push(T[it]);
ile2++;
}
else {
S -= (poz - q.front());
q.pop();
S += (T[it] - poz);
q.push(T[it]);
ile2++;
ile1--;
}
it++;
}
ans = max(ans, ile1 + ile2);
}
return ans;
}