This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
// Author: Robert Jaworski
#include <bits/stdc++.h>
using namespace std;
int dp(int N, int M, const vector<int>& s, const vector<int>& f, vector<int>& dir) {
constexpr int DP_R = 0;
constexpr int DP_LL = 1;
constexpr int DP_RL = 2;
constexpr int DP_SIZE = 3;
vector<int> dp(DP_SIZE * (N + 1)); // min K to water all the plants until s[i]
auto DP = [&] (int si, int conf) -> decltype(auto) {
return dp[DP_SIZE + si * DP_SIZE + conf];
};
dp[DP_LL] = 0;
dp[DP_R] = dp[DP_RL] = 0x7fffffff;
auto WATER = [&] (int siR, int siL, int fi) {
if (fi < 0) return 0;
int R = 0 <= siR && siR < N ? f[fi] - s[siR] : 0x7fffffff;
if (R < 0) R = 0x7fffffff;
int L = 0 <= siL && siL < N ? s[siL] - f[fi] : 0x7fffffff;
if (L < 0) L = 0x7fffffff;
return min(R, L);
};
auto CHECK = [&] (int si, int dp1, int dp2, int fi, int pfi, int ppfi) {
if (dp2 == DP_RL && dp1 != DP_R) return 0x7fffffff;
if (dp2 == DP_LL && dp1 == DP_R) return 0x7fffffff;
int k = DP(si-1, dp1);
int r = dp1 == DP_R ? si-1 : dp1 == DP_RL ? si-2 : dp2 == DP_R ? si : -1;
int l = dp2 != DP_R ? si : dp1 != DP_R ? si-1 : -1;
for (int ffi = pfi+1; ffi <= fi; ffi++) {
if (s[si] != f[ffi]) k = max(k, WATER(r, l, ffi));
}
if (dp2 == DP_RL && si-1 >= 0) {
for (int dp3 = 0; dp3 < DP_SIZE; dp3++) {
int k2 = DP(si-2, dp3);
int r2 = dp3 == DP_R ? si-2 : dp3 == DP_RL ? si-3 : -1;
for (int ffi = ppfi+1; ffi <= fi; ffi++) {
if (s[si] != f[ffi]) k2 = max(k2, WATER(r2, l, ffi));
}
k = min(k, k2);
}
}
return k;
};
int si, fi, pfi, ppfi;
for (si = 0, fi = pfi = ppfi = -1; si < N; si++) {
while (fi + 1 < M && f[fi+1] <= s[si]) fi++;
DP(si, DP_R) = DP(si, DP_LL) = DP(si, DP_RL) = 0x7fffffff;
for (int dp1 = 0; dp1 < DP_SIZE; dp1++) {
for (int dp2 = 0; dp2 < DP_SIZE; dp2++) {
DP(si, dp2) = min(DP(si, dp2), CHECK(si, dp1, dp2, fi, pfi, ppfi));
}
}
ppfi = pfi;
pfi = fi;
}
fi = M - 1;
int K = 0x7fffffff;
int choice = -1;
if (fi == pfi) {
if (DP(si-1, DP_R) < K) {
K = DP(si-1, DP_R);
choice = DP_R;
}
if (DP(si-1, DP_RL) < K) {
K = DP(si-1, DP_RL);
choice = DP_RL;
}
if (DP(si-1, DP_LL) < K) {
K = DP(si-1, DP_LL);
choice = DP_LL;
}
}
else {
if (DP(si-1, DP_R) < K) {
K = max(DP(si-1, DP_R), WATER(si-1, -1, fi));
choice = DP_R;
}
if (DP(si-1, DP_RL) < K) {
int k = max(DP(si-1, DP_RL), WATER(si-2, -1, fi));
if (k < K) {
K = k;
choice = DP_RL;
}
}
}
if (K < 0x7fffffff) {
dir.resize(N, 0);
for (si = N; si-- > 0;) {
switch (choice) {
case DP_R:
dir[si] = 1;
if (DP(si-1, DP_R) <= K) choice = DP_R;
else if (DP(si-1, DP_RL) <= K) choice = DP_RL;
else if (DP(si-1, DP_LL) <= K) choice = DP_LL;
else {
cerr << "Bad" << endl;
}
break;
case DP_RL:
dir[si] = 0;
choice = DP_R;
break;
case DP_LL:
dir[si] = 0;
if (DP(si-1, DP_RL) <= K) choice = DP_RL;
else if (DP(si-1, DP_LL) <= K) choice = DP_LL;
else {
cerr << "Bad" << endl;
}
break;
}
}
}
return K;
}
int main() {
// freopen("data/inputs/01_right_closed.in", "r", stdin);
int N, M;
cin >> N >> M;
vector<int> s(N, 0);
vector<int> f(M, 0);
vector<int> conf;
for (auto&& x : s) {
cin >> x;
}
for (auto&& x : f) {
cin >> x;
}
if (N == 1) {
if (s.back() <= f[0]) {
cout << (f.back() - s.back()) << endl << "R" << endl;
}
else if (s[0] >= f.back()) {
cout << (s[0] - f[0]) << endl << "L" << endl;
}
else {
cout << -1 << endl;
}
return 0;
}
int K = dp(N, M, s, f, conf);
if (K == 0x7fffffff) {
cout << -1 << endl;
return 0;
}
cout << K << endl;
for (auto&& x : conf) {
cout << (x ? 'R' : 'L');
}
cout << endl;
return 0;
}
# | 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... |