제출 #1161359

#제출 시각아이디문제언어결과실행 시간메모리
1161359fatman87878Growing Vegetables is Fun 5 (JOI24_vegetables5)C++20
37 / 100
3965 ms12188 KiB
#include<bits/stdc++.h>
using namespace std;
#define IOS cin.tie(nullptr)->sync_with_stdio(0),cin.exceptions(cin.failbit);
#define lb(x) (x)&-(x)
#define all(x) (x).begin(),(x).end()
#define ll long long

constexpr int maxN=3e5+5;

int n,a[2][maxN<<1],b[2][maxN],spp[2][maxN<<1],valid[2][maxN];

inline int chk(int guess){
    for(int t:{0,1}){
        fill(valid[0],valid[0]+n+1,0);
        fill(valid[1],valid[1]+n+1,0);
        for(int i = 0;i<n;i++){
            int _l = lower_bound(b[t],b[t]+n,a[0][i]-guess)-b[t]-1;
            int _r = upper_bound(b[t],b[t]+n,a[0][i]+guess)-b[t]-1;
            swap(_l,_r);
            int pos0 = i,l = 0,r = 0;
            if(pos0-_l>spp[0][i])l = n+1;
            else l = pos0-_l;
            if(pos0-_r<=spp[0][i])r = pos0-_r;
            else r = n+1;
            l = max(0,l);
            r = max(l,r);
            r = min(i+1,r);
            l = min(l,r);
            valid[0][l]++;
            valid[0][r]--;
            //cout<<l<<' '<<r<<'\n';
        }
        for(int i = n;i<2*n;i++){
            int _l = lower_bound(b[t],b[t]+n,a[0][i]-guess)-b[t];
            int _r = upper_bound(b[t],b[t]+n,a[0][i]+guess)-b[t];
            int pos0 = n-(i-n + min(2*n-i-1,max(0,n-spp[0][i])))-1,l = 0,r = 0;
            //cout<<pos0<<' '<<_l<<' '<<_r<<' ';
            if(_l-pos0<=0)l = 0;
            else l = min(n+1,max(i-n+1,spp[0][i]-1)+_l-pos0);
            if(_r-pos0<=0)r = 0;
            else r = min(n+1,max(i-n+1,spp[0][i]-1)+_r-pos0);
            l = max(l,i-n+1);
            r = max(r,l);
            valid[0][l]++;
            valid[0][r]--;
            //cout<<l<<' '<<r<<'\n';
        }
        for(int i = 0;i<n;i++){
            int _l = lower_bound(b[!t],b[!t]+n,a[1][i]-guess)-b[!t];
            int _r = upper_bound(b[!t],b[!t]+n,a[1][i]+guess)-b[!t];
            int pos0 = n-i-1,l = 0,r = 0;
            if(_l-pos0>spp[0][i+n])l = n+1;
            else l = _l-pos0;
            if(_r-pos0<=spp[0][i+n])r = _r-pos0;
            else r = n+1;
            l = max(0,l);
            r = max(l,r);
            r = min(i+1,r);
            l = min(l,r);
            valid[1][l]++;
            valid[1][r]--;
            //cout<<l<<' '<<r<<'\n';
        }
        for(int i = n;i<2*n;i++){
            int _l = lower_bound(b[!t],b[!t]+n,a[1][i]-guess)-b[!t]-1;
            int _r = upper_bound(b[!t],b[!t]+n,a[1][i]+guess)-b[!t]-1;
            swap(_l,_r);
            int pos0 = i-n + min(2*n-i-1,max(0,n-spp[0][i-n])),l = 0,r = 0;
            if(pos0-_l<=0)l = 0;
            else l = min(n+1,max(i-n+1,spp[0][i-n])+pos0-_l);
            if(pos0-_r<=0)r = 0;
            else r = min(n+1,max(i-n+1,spp[0][i-n])+pos0-_r);
            l = max(l,i-n+1);
            r = max(r,i-n+1);
            valid[1][l]++;
            valid[1][r]--;
            //cout<<l<<' '<<r<<'\n';
        }
        for(int i = 0;i<=n;i++){
            valid[0][i+1]+=valid[0][i];
            valid[1][i+1]+=valid[1][i];
            if(valid[0][i]==n&&valid[1][i]==n)return 1;
        }
        //cout<<'\n';
    }
    return 0;
}

int main(){
    IOS
    cin>>n;
    for(int i = 0;i<2*n;i++)cin>>a[0][i],a[1][(i+n)%(2*n)]=a[0][i];
    for(int i:{0,1})for(int j = 0;j<n;j++)cin>>b[i][j];
    sort(b[0],b[0]+n);
    sort(b[1],b[1]+n);
    for(int i = 0;i<n;i++){
        int l = n,r = 2*n,mid;
        for(;l+1<r;){
            mid=l+r>>1;
            if(a[0][mid]>a[0][i])l = mid;
            else r = mid;
        }
        spp[0][i] = l-n+1;
        if(l==2*n&&a[0][n]>a[0][i])spp[0][i] = n+1;
        //cout<<spp[0][i]<<' ';
    }
    for(int i = n;i<2*n;i++){
        int l = 0,r = n+1,mid;
        for(;l+1<r;){
            mid=l+r>>1;
            if(a[0][mid-1]<a[0][i])l = mid;
            else r = mid;
        }
        spp[0][i] = l;
        if(l==n&&a[0][n-1]<a[0][i])spp[0][i] = n+1;
        //cout<<spp[0][i]<<' ';
    }
    //cout<<'\n';
    int l = 0,r = max({*max_element(a[0],a[0]+2*n),*max_element(b[0],b[0]+n),*max_element(b[1],b[1]+n)}),mid;
    for(;l<r;){
        mid = l+r>>1;
        if(chk(mid))r=mid;
        else l = mid+1;
    }
    cout<<l<<'\n';
}
#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...