Submission #1122676

#TimeUsernameProblemLanguageResultExecution timeMemory
1122676ksujay2Growing Vegetables is Fun 5 (JOI24_vegetables5)C++20
0 / 100
2789 ms7488 KiB
#include <bits/stdc++.h>
using namespace std;
const int MXN = 300000;

int bsmax(int lo, int hi, function<bool(int)> f)
{
    lo--;
    while (hi > lo)
    {
        int mid = (hi + lo + 1) / 2;
        if (f(mid))
            lo = mid;
        else
            hi = mid - 1;
    }
    return lo;
}

int main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int N; cin >> N;
    vector<int> a(2 * N);
    for(int i = 0; i < 2 * N; i++) cin >> a[i];

    int k = 0;
    while(k < N && a[k] <= a[k + N]) k++;
    rotate(a.begin(), a.begin() + k, a.end());

    vector<int> o(2 * N);
    for(int i = 0; i < 2 * N; i++) o[i] = i;
    sort(o.begin(), o.end(), [&] (int x, int y) { return a[x] < a[y]; });

    vector<int> b(N), c(N);
    for(int i = 0; i < N; i++) cin >> b[i];
    for(int i = 0; i < N; i++) cin >> c[i];
    sort(b.begin(), b.end());
    sort(c.begin(), c.end());


    bool flipped = false;
    auto check_lo = [&] (int x, vector<int>& b) {
        int j = 0;
        for(int i : o) {
            if((x <= i && i < x + N) || (x - 2 * N <= i && i < x - N)) {
                if(a[i] < b[j]) return flipped;
                j++;
            }
        }
        return !flipped;
    };

    auto find_range = [&] (int o, vector<int>& b) {
        flipped = !flipped;
        int l = check_lo(o, b) + flipped - 1;
        flipped = !flipped;
        int r = bsmax(0, N, [&] (int x) {
            return check_lo(x + o, b);
        }) + flipped;
        return make_pair(l, r);
    };

    auto check = [&] (int x) {

        for(int& bi : b) bi -= x;
        for(int& ci : c) ci -= x;
        auto [l1, r1] = find_range(0, b);
        auto [l7, r7] = find_range(0, c);
        flipped = !flipped;
        auto [l3, r3] = find_range(N, c);
        auto [l5, r5] = find_range(N, b);
        flipped = !flipped;

        for(int& bi : b) bi += x;
        for(int& ci : c) ci += x;

        for(int& ai : a) ai *= -1;
        for(int& bi : b) bi *= -1;
        for(int& ci : c) ci *= -1;
        reverse(o.begin(), o.end());
        reverse(b.begin(), b.end());
        reverse(c.begin(), c.end());

        for(int& bi : b) bi -= x;
        for(int& ci : c) ci -= x;
        flipped = !flipped;
        auto [l8, r8] = find_range(0, b);
        auto [l4, r4] = find_range(0, c);
        flipped = !flipped;
        auto [l6, r6] = find_range(N, c);
        auto [l2, r2] = find_range(N, b);
        for(int& bi : b) bi += x;
        for(int& ci : c) ci += x;

        for(int& bi : b) bi *= -1;
        for(int& ci : c) ci *= -1;
        for(int& ai : a) ai *= -1;
        reverse(o.begin(), o.end());
        reverse(b.begin(), b.end());
        reverse(c.begin(), c.end());

        bool good = false;
        {
            int l = max(l1, l2), r = min(r1, r2);
            int rl = min(l3, l4), rr = max(r3, r4);
            good = good || ((l <= r) && ((l <= rl) || (rr <= r)));
        }
        {
            int l = max(l5, l6), r = min(r5, r6);
            int rl = min(l7, l8), rr = max(r7, r8);
            good = good || ((l <= r) && ((l <= rl) || (rr <= r)));
        }
        return good;
    };

    int ans = bsmax(0, 1e9, [&] (int x) {
        return !check(x);
    }) + 1;
    cout << ans << endl;
}
#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...