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>
constexpr const int mxn = 1'000'000;
long long her[2][mxn];
int ord[2][mxn];
long long pre[mxn];
int c, n;
bool check(long long mid, const std::vector <int>& d) {
static long long corners[2][2];
static long long hbb[2], hsbb[2], hwb[2];
corners[0][0] = corners[0][1] = corners[1][0] = corners[1][1] = hbb[0] = hbb[1] = hsbb[0] = hsbb[1] = -(1LL << 60);
hwb[0] = hwb[1] = -1;
for (int i = 0, rb = n - 1; i < n; i++) {
if (mid - 10 < static_cast <long long> (2e9)) {
while (~rb && her[0][i] + her[1][rb] > mid) {
for (int k = 0; k < 2; k++) {
long long now = d[ord[1][rb]] + (k ? -pre[ord[1][rb]] : pre[ord[1][rb]]);
if (now > hbb[k]) {
hsbb[k] = hbb[k];
hbb[k] = now;
hwb[k] = ord[1][rb];
} else if (now > hsbb[k]) {
hsbb[k] = now;
}
}
rb--;
}
for (int ii = 0; ii < 2; ii++) {
for (int jj = 0; jj < 2; jj++) {
corners[ii][jj] = std::max(corners[ii][jj], c - mid + d[ord[0][i]] + (hwb[jj] == ord[0][i] ? hsbb[jj] : hbb[jj]) + (ii ? -pre[ord[0][i]] : pre[ord[0][i]]));
}
}
} else {
while (~rb && her[0][i] + her[1][rb] > mid) {
for (int k = 0; k < 2; k++) {
hbb[k] = std::max(hbb[k], (long long) d[ord[1][rb]] + (k ? -pre[ord[1][rb]] : pre[ord[1][rb]]));
}
rb--;
}
for (int ii = 0; ii < 2; ii++) {
for (int jj = 0; jj < 2; jj++) {
corners[ii][jj] = std::max(corners[ii][jj], c - mid + d[ord[0][i]] + hbb[jj] + (ii ? -pre[ord[0][i]] : pre[ord[0][i]]));
}
}
}
if (corners[0][0] + corners[1][1] > 0LL || corners[0][1] + corners[1][0] > 0LL) {
return false;
}
}
for (int i = 0; i < n; i++) {
long long l = std::max(+corners[0][0] - pre[i], +corners[1][0] + pre[i]);
long long r = std::min(-corners[0][1] + pre[i], -corners[1][1] - pre[i]);
if (l > r) {
continue;
}
auto lb = std::lower_bound(pre, pre + n, l);
if (lb != pre + n && *lb <= r) {
return true;
}
}
return false;
}
long long find_shortcut(int _n, std::vector <int> el, std::vector <int> d, int _c) {
n = _n;
c = _c;
if (n == 2) {
return (long long) std::min(el[0], c) + d[0] + d[1];
}
for (int i = 1; i < n; i++) {
pre[i] = pre[i - 1] + el[i - 1];
}
for (int i = 0; i < n; i++) {
her[0][i] = +pre[i] + d[i];
her[1][i] = -pre[i] + d[i];
}
for (int i = 0; i < 2; i++) {
std::iota(ord[i], ord[i] + n, 0);
std::sort(ord[i], ord[i] + n, [&] (int u, int v) -> bool { return her[i][u] < her[i][v]; });
std::sort(her[i], her[i] + n);
}
long long l = 0, r = pre[n - 1] + (1LL << 31);
while (l <= r) {
long long mid = (l + r) >> 1;
if (check(mid, d)) {
r = mid - 1;
} else {
l = mid + 1;
}
}
return l;
}
# | 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... |
# | 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... |