This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
const int NMAX = (int)1e5 * 2;
int pref_val[NMAX],suf_val[NMAX];
int besthub(int R, int L, int X[], long long B) {
int ans = 0;
for (int i = 0; i < R;++i) {
pref_val[i] = X[i];
if (i) {
pref_val[i] += pref_val[i - 1];
}
}
for (int i = R - 1; i >= 0;--i) {
suf_val[i] = suf_val[i + 1] + L - X[i];
}
auto f = [&] (int li,int ri,int to_left){
int k = ri - li + 1;
int aux = B;
if (to_left >= li) return k;
aux = aux - ((suf_val[li - to_left] - suf_val[li]) - (L - X[li]) * to_left);
if (aux < 0) return -1;
k += to_left;
int l = 0,r = R - ri;
int len = 0;
while (l <= r) {
int mid = (l + r) / 2;
if (pref_val[ri + mid] - pref_val[ri] - X[ri] * mid <= aux) {
len = mid;
l = mid + 1;
}
else
r = mid - 1;
}
k += len;
return k;
};
for (int i = 0; i < R;++i) {
int j = i;
while (X[j] == X[j + 1]) ++j;
int l = 0,r = i;
while (l < r) {
int mid = (l + r) / 2;
int a = f(i,j,mid);
int b = f(i,j,mid + 1);
ans = max({ans,a,b});
if (a > b)
r = mid;
else
l = mid + 1;
}
//cout << ans << '\n';
}
return ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |