# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1250037 | domi | Sprinklers (CEOI24_sprinklers) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define sz(a) (int)((a).size())
#define all(a) (a).begin(), (a).end()
#define lsb(x) (x & (-x))
#define vi vector<int>
#define YES { cout << "YES" << endl; return; }
#define NO { cout << "NO" << endl; return; }
using ll = long long;
using pii = std::pair<int, int>;
const int NMAX = 1e5;
using namespace std;
int f[NMAX + 5], s[NMAX + 5], dp[NMAX + 5], n, m;
int lower_(int x) {
auto it = std::upper_bound(f + 1, f + m + 1, x);
if (it == f + 1) return -1;
return int(it - f - 1);
}
int greater_(int x) {
auto it = std::lower_bound(f + 1, f + m + 1, x);
if (it == f + m + 1) return -1;
return int(it - f);
}
pair<int, string> check(int k, bool print = false) {
string res, prv;
if (print) {
res.assign(n, 'L');
prv.assign(n, 'L');
}
fill(dp + 1, dp + n + 2, 0);
for (int i = 1; i <= n; ++i) {
dp[i] = dp[i - 1];
///stanga
int l = greater_(s[i] - k), r = lower_(s[i]);
if (l != -1 && l <= r && dp[i - 1] >= l - 1 && dp[i] < r) {
dp[i] = r;
if (print) {
res[i - 1] = 'L';
prv[i - 1] = 'L';
}
}
///dreapta
l = greater_(s[i]), r = lower_(s[i] + k);
if (l != -1 && l <= r && dp[i - 1] >= l - 1 && dp[i] < r) {
dp[i] = r;
if (print) {
res[i - 1] = 'R';
prv[i - 1] = 'R';
}
}
///dreapta stanga
if (i == 1 || s[i] - s[i - 1] > k)continue;
l = greater_(s[i] - k), r = lower_(s[i - 1] + k);
if (l != -1 && l <= r && dp[i - 2] >= l - 1 && dp[i] < r) {
dp[i] = r;
if (print) {
res[i - 2] = 'R';
res[i - 1] = 'L';
prv[i - 2] = 'R';
prv[i - 1] = 'L';
if (i >= 3)
res[i - 3] = prv[i - 3];
}
}
}
return {dp[n] == m, res};
}
signed main() {
cin.tie(nullptr)->sync_with_stdio(false);
cin >> n >> m;
for (int i = 1; i <= n; ++i)
cin >> s[i];
for (int i = 1; i <= m; ++i)
cin >> f[i];
int lo = 0, hi = 1e9, ans = 0;
while (lo <= hi) {
auto mid = (lo + hi) >> 1;
if (check(mid).fi) {
ans = mid;
hi = mid - 1;
}
else
lo = mid + 1;
}
if (ans == 0)
cout << "-1\n", exit(0);
cout << ans << '\n' << check(ans, true).se << '\n';
return 0;
}