Submission #1176692

#TimeUsernameProblemLanguageResultExecution timeMemory
1176692dragstGrowing Vegetables is Fun 5 (JOI24_vegetables5)C++20
0 / 100
694 ms23924 KiB
#include <bits/stdc++.h>
using namespace std;

long long n, a[600005], b[300005], c[300005], l[300005], r[300005], bit[600005], bit2[600005];

void add(long long x, long long y)
{
    while (x<=2*n)
    {
        bit[x]+=y;
        x+=(x&(-x));
    };
}

long long sum(long long x)
{
    long long ans=0;
    while (x>0)
    {
        ans+=bit[x];
        x-=(x&(-x));
    };
    return ans;
}

void add2(long long x, long long y)
{
    while (x<=2*n)
    {
        bit2[x]+=y;
        x+=(x&(-x));
    };
}

long long sum2(long long x)
{
    long long ans=0;
    while (x>0)
    {
        ans+=bit2[x];
        x-=(x&(-x));
    };
    return ans;
}

bool check(long long x)
{
    long long i, j=1, k=2*n;
    for (i=1; i<=2*n; i++) {bit[i]=bit2[i]=0;};
    for (i=1; i<=n; i++)
    {
        while (j<=n+1 && a[j]<=b[i]+x) {j++;};
        l[i]=j-i+1;
        while (k>n && a[k]<=b[i]+x) {k--;};
        r[i]=k+i-n;
        if (l[i]>r[i]) {continue;}
        else if (l[i]<1)
        {
            l[i]+=2*n;
            if (l[i]<=k) {continue;}
            else
            {
                add(l[i], 1);
                add(1, 1);
                add(r[i]+1, -1);
            };
        }
        else
        {
            add(l[i], 1);
            add(r[i]+1, -1);
        };
    };
    j=1; k=2*n;
    for (i=1; i<=n; i++)
    {
        while (j<=n+1 && a[j]<b[i]-x) {j++;};
        r[i]=j-i;
        while (k>n && a[k]<b[i]-x) {k--;};
        l[i]=k+i-n+1;
        if (l[i]<=r[i]) {add(1, 1);}
        else if (r[i]<1)
        {
            r[i]+=2*n;
            if (r[i]<=k) {continue;}
            else
            {
                add(l[i], 1);
                add(r[i]+1, -1);
            };
        }
        else
        {
            add(l[i], 1);
            add(1, 1);
            add(r[i]+1, -1);
        };
    };
    j=1; k=2*n;
    for (i=1; i<=n; i++)
    {
        while (j<=n+1 && a[j]<=c[i]+x) {j++;};
        l[i]=j-i+1;
        while (k>n && a[k]<=c[i]+x) {k--;};
        r[i]=k+i-n;
        if (l[i]>r[i]) {continue;}
        else if (l[i]<1)
        {
            l[i]+=2*n;
            if (l[i]<=k) {continue;}
            else
            {
                add2(l[i], 1);
                add2(1, 1);
                add2(r[i]+1, -1);
            };
        }
        else
        {
            add2(l[i], 1);
            add2(r[i]+1, -1);
        };
    };
    j=1; k=2*n;
    for (i=1; i<=n; i++)
    {
        while (j<=n+1 && a[j]<c[i]-x) {j++;};
        r[i]=j-i;
        while (k>n && a[k]<c[i]-x) {k--;};
        l[i]=k+i-n+1;
        if (l[i]<=r[i]) {add2(1, 1);}
        else if (r[i]<1)
        {
            r[i]+=2*n;
            if (r[i]<=k) {continue;}
            else
            {
                add2(l[i], 1);
                add2(r[i]+1, -1);
            };
        }
        else
        {
            add2(l[i], 1);
            add2(1, 1);
            add2(r[i]+1, -1);
        };
    };
    for (i=1; i<=2*n; i++)
    {
        j=i+n;
        if (j>2*n) {j-=2*n;};
        if (sum(i)==0 && sum2(j)==0) {return true;};
    };
    return false;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    long long i, low=0, high=0, mid;
    cin >> n;
    for (i=1; i<=2*n; i++)
    {
        cin >> a[i];
        high=max(high, a[i]);
    };
    for (i=1; i<=n; i++)
    {
        cin >> b[i];
    };
    sort(b+1, b+n+1);
    for (i=1; i<=n; i++)
    {
        cin >> c[i];
    };
    sort(c+1, c+n+1);
    while (low<=high)
    {
        mid=(low+high)/2;
        if (check(mid)) {high=mid-1;}
        else {low=mid+1;};
    };
    cout << low;
}
#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...