This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
// ItnoE
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 505;
int n, wlen, D[N];
ll L[N], LL[N], F1[N][N], F2[N][N];
ll suff[N], pref[N];
inline ll Dist(int i, int j)
{
return (abs(L[i] - L[j]));
}
ll GGG = -1;
inline ll Solve(int a, int b)
{
/*ll tmpMx = 0;
for (int i = 0; i < n; i ++)
for (int j = i + 1; j < n; j ++)
tmpMx = max(tmpMx, min({Dist(i, j), Dist(i, a) + Dist(b, j) + wlen, Dist(i, b) + Dist(a, j) + wlen}) + D[i] + D[j]);*/
if (L[b] - L[a] <= wlen)
{
if (GGG != -1)
return (GGG);
ll Mx = 0;
for (int i = 0; i < n; i ++)
for (int j = i + 1; j < n; j ++)
Mx = max(Mx, L[j] - L[i] + D[i] + D[j]);
GGG = Mx;
return (Mx);
}
if (a > b) swap(a, b);
ll Mx = max(pref[a], suff[b]);
Mx = max(Mx, F2[a][0] + F1[b][n - 1] + wlen);
{
ll val = (L[a] + L[b] + wlen);
int lb = upper_bound(LL + a, LL + b, val) - LL;
if (lb > a)
Mx = max(Mx, F2[a][0] + F1[a + 1][lb - 1] + L[a + 1] - L[a]);
if (lb < b)
Mx = max(Mx, F2[a][0] + F2[b - 1][lb] + wlen + L[b] - L[b - 1]);
}
{
ll val = (L[a] + L[b] - wlen) >> 1;
int lb = upper_bound(L + 1, L + n, val) - L;
Mx = max(Mx, F1[b][n - 1] + F2[b - 1][lb] + L[b] - L[b - 1]);
Mx = max(Mx, F1[b][n - 1] + F1[a][lb - 1] + wlen);
}
int r = a;
for (int k = a; k < b; k ++)
{
while (r <= b && 2 * L[r] <= L[b] - L[a] + 2 * L[k] + wlen)
r ++;
if (k + 1 <= r - 1)
Mx = max(Mx, D[k] + F1[k + 1][r - 1] + L[k + 1] - L[k]);
if (r <= b)
Mx = max(Mx, D[k] + L[k] - L[a] + wlen + F2[b][r]);
}
//assert(Mx <= tmpMx);
return (Mx);
}
int64_t find_shortcut(int _n, vector < int > _L, vector < int > _D, int _c)
{
n = _n; wlen = _c;
for (int i = 0; i < n - 1; i ++)
L[i + 1] = L[i] + _L[i];
for (int i = 0; i < n; i ++)
LL[i] = L[i] * 2LL;
for (int i = 0; i < n; i ++)
D[i] = _D[i];
memset(F1, -63, sizeof(F1));
memset(F2, -63, sizeof(F2));
for (int i = 0; i < n; i ++)
{
F1[i][i] = D[i];
for (int j = i + 1; j < n; j ++)
F1[i][j] = max(F1[i][j - 1], D[j] + L[j] - L[i]);
}
for (int i = n - 1; i >= 0; i --)
{
F2[i][i] = D[i];
for (int j = i - 1; j >= 0; j --)
F2[i][j] = max(F2[i][j + 1], D[j] + L[i] - L[j]);
}
pref[0] = D[0];
ll CMx = D[0];
for (int i = 1; i < n; i ++)
{
CMx += L[i] - L[i - 1];
pref[i] = max(pref[i - 1], CMx + D[i]);
CMx = max(CMx, (ll)D[i]);
}
suff[n - 1] = D[n - 1];
CMx = D[n - 1];
for (int i = n - 2; i >= 0; i --)
{
CMx += L[i + 1] - L[i];
suff[i] = max(suff[i + 1], CMx + D[i]);
CMx = max(CMx, (ll)D[i]);
}
ll Mn = Solve(0, 0);
for (int i = 0; i < n; i ++)
for (int j = i + 1; j < n; j ++)
Mn = min(Mn, Solve(i, j));
return (Mn);
}
/*int main()
{
int nn = 5;
int cc = 0;
vector < int > LL = {20, 20, 40, 20};
vector < int > DD = {390, 5, 400, 400, 390};
ll Mn = find_shortcut(nn, LL, DD, cc);
printf("%lld\n", Mn);
}*/
Compilation message (stderr)
shortcut.cpp: In function 'int64_t find_shortcut(int, std::vector<int>, std::vector<int>, int)':
shortcut.cpp:50:39: warning: array subscript is below array bounds [-Warray-bounds]
Mx = max(Mx, F1[b][n - 1] + F2[b - 1][lb] + L[b] - L[b - 1]);
~~~~~~~~^
shortcut.cpp:50:61: warning: array subscript is below array bounds [-Warray-bounds]
Mx = max(Mx, F1[b][n - 1] + F2[b - 1][lb] + L[b] - L[b - 1]);
~~~~~~~^
# | 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... |