Submission #1344924

#TimeUsernameProblemLanguageResultExecution timeMemory
1344924MisterReaperGrowing Vegetables is Fun 5 (JOI24_vegetables5)C++20
100 / 100
1726 ms15712 KiB
#include <bits/stdc++.h>

using i64 = long long;

#ifdef DEBUG 
    #include "/home/ahmetalp/Desktop/Workplace/debug.h"
#else
    #define debug(...) void(23)
#endif

constexpr int inf = int(1E9);

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int N;
    std::cin >> N;

    std::vector<int> A(2 * N), B(N), C(N);
    for (int i = 0; i < 2 * N; ++i) {
        std::cin >> A[i];
    }
    for (int i = 0; i < N; ++i) {
        std::cin >> B[i];
    }
    for (int i = 0; i < N; ++i) {
        std::cin >> C[i];
    }

    std::sort(B.begin(), B.end());
    std::sort(C.begin(), C.end());

    auto A1 = A;
    auto B1 = B;
    auto C1 = C;

    std::rotate(A1.begin(), A1.begin() + N, A1.end());
    std::reverse(B1.begin(), B1.end());
    std::reverse(C1.begin(), C1.end());

    for (auto& x : A1) {
        x = -x;
    }
    for (auto& x : B1) {
        x = -x;
    }
    for (auto& x : C1) {
        x = -x;
    }

    int ans = inf;
    for (int done = 0; done < 2; ++done) {
        auto check = [&](auto x) -> bool {
            debug("check", x);
            auto work = [&](auto seedlings, auto plants) -> std::vector<int> {
                std::vector<int> ps(N + 1);
                auto mark_good = [&](auto l, auto r) -> void {
                    assert(0 <= l && l <= r && r <= N);
                    ps[l] += 1;
                    ps[r] -= 1;
                };
                int pl = 0, pr = 0, sr = 2 * N;
                for (int i = 0; i < N; ++i) {
                    while (pl < N && plants[pl] < seedlings[i] - x) {
                        pl += 1;
                    }
                    while (pr < N && plants[pr] <= seedlings[i] + x) {
                        pr += 1;
                    }
                    while (sr - 1 >= N && seedlings[sr - 1] < seedlings[i]) {
                        sr -= 1;
                    }
                    int lo = i - sr + N;
                    if (pr <= lo) { 
                        continue;
                    }
                    int l = std::max(0, i - pr + 1);
                    int r = (pl <= lo ? i + 1 : i - pl + 1);
                    if (l <= r) {
                        mark_good(l, r);
                    }
                }
                pl = N, pr = N, sr = N;
                for (int i = N; i < 2 * N; ++i) {
                    while (pl - 1 >= 0 && plants[pl - 1] >= seedlings[i] - x) {
                        pl -= 1;
                    }
                    while (pr - 1 >= 0 && plants[pr - 1] > seedlings[i] + x) {
                        pr -= 1;
                    }
                    while (sr - 1 >= 0 && seedlings[sr - 1] > seedlings[i]) {
                        sr -= 1;
                    }
                    int lo = N - i + sr - 1;
                    if (pr <= lo) {
                        continue;
                    }
                    int l = (pl <= lo ? i - N + 1 : i - N + 1 + pl); 
                    int r = std::min(N, i - N + 1 + pr);
                    if (l <= r) {
                        mark_good(l, r);
                    }
                }
                for (int i = 1; i <= N; ++i) {
                    ps[i] += ps[i - 1];
                }
                return ps;
            };
            auto vec1 = work(A, B);
            auto vec2 = work(A1, C1);
            debug(vec1, vec2);
            for (int i = 0; i < N; ++i) {
                if (vec1[i] == N && vec2[i] == N) {
                    return true;
                }
            }
            return false;
        };
        int lo = 0, hi = inf;
        while (lo < hi) {
            int mid = (lo + hi) >> 1;
            if (check(mid)) {
                hi = mid;
            } else {
                lo = mid + 1;
            }
        }
        debug(lo);
        ans = std::min(ans, lo);
        std::swap(B, C);
        std::swap(B1, C1);
    }

    std::cout << ans << '\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...