Submission #1250041

#TimeUsernameProblemLanguageResultExecution timeMemory
1250041domiSprinklers (CEOI24_sprinklers)C++20
26 / 100
611 ms6472 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 (int32_t)(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 (int32_t)(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;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...