Submission #1241798

#TimeUsernameProblemLanguageResultExecution timeMemory
1241798hengliaoGrowing Vegetables is Fun 5 (JOI24_vegetables5)C++20
100 / 100
2727 ms32548 KiB
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;

#define F first
#define S second
#define pll pair<ll, ll>
#define vll vector<ll>
#define pb push_back

typedef long long ll;

const ll mxN=2e6+5;
const ll inf=1e18;

ll n;

ll a[mxN];
vll b, c;
bool pos[mxN][2];

void solve(){
	cin>>n;
	for(ll i=0;i<2*n;i++){
		cin>>a[i];
		a[i+2*n]=a[i];
	}
	b=vll(n);
	for(auto &it:b){
		cin>>it;
	}
	c=vll(n);
	for(auto &it:c){
		cin>>it;
	}
	sort(b.begin(), b.end());
	sort(c.begin(), c.end());

	auto qry=[&](ll tar, ll diff, ll flag){
		if(flag==0){
			ll mx=tar+diff;
			ll lef=0, rig=n-1;
			ll good1=-1;
			while(lef<=rig){
				ll mid=(lef+rig)/2;
				if(b[mid]<=mx){
					good1=mid;
					lef=mid+1;
				}
				else{
					rig=mid-1;
				}
			}
			// if(good1!=-1 && b[good1]<tar){
			// 	good1=-1;
			// }
			ll mn=tar-diff;
			lef=0;
			rig=n-1;
			ll good2=n;
			while(lef<=rig){
				ll mid=(lef+rig)/2;
				if(b[mid]>=mn){
					good2=mid;
					rig=mid-1;
				}
				else{
					lef=mid+1;
				}
			}
			// if(good2!=n && b[good2]>tar){
			// 	good2=n;
			// }
			if(good2>good1){
				return make_pair(n, -1LL);
			}
			return make_pair(good2, good1);
		}
		else{
			ll mx=tar+diff;
			ll lef=0, rig=n-1;
			ll good1=-1;
			while(lef<=rig){
				ll mid=(lef+rig)/2;
				if(c[mid]<=mx){
					good1=mid;
					lef=mid+1;
				}
				else{
					rig=mid-1;
				}
			}
			// if(good1!=-1 && c[good1]<tar){
			// 	good1=-1;
			// }
			ll mn=tar-diff;
			lef=0;
			rig=n-1;
			ll good2=n;
			while(lef<=rig){
				ll mid=(lef+rig)/2;
				if(c[mid]>=mn){
					good2=mid;
					rig=mid-1;
				}
				else{
					lef=mid+1;
				}
			}
			// if(good2!=n && c[good2]>tar){
			// 	good2=n;
			// }
			if(good2>good1){
				return make_pair(n, -1LL);
			}
			return make_pair(good2, good1);
		}
	};

	vll v(2*n);

	ll pt=2*n;

	for(ll i=0;i<n;i++){
		while(pt-1>=n && a[pt-1]<a[i]){
			pt--;
		}
		v[i]=pt;
	}

	pt=-1;

	for(ll i=2*n-1;i>=n;i--){
		while(pt+1<n && a[pt+1]<=a[i]){
			pt++;
		}
		v[i]=pt;
	}

	auto dumb=[&](ll idx){
		return v[idx];
	};

	vll bad_cnt(2*n);

	auto mark=[&](ll lef, ll rig){
		// cout<<"marking "<<lef<<' '<<rig<<'\n';
		if(lef<=rig){
			bad_cnt[lef]++;
			if(rig<2*n-1) bad_cnt[rig+1]--;
		}
		else{
			bad_cnt[lef]++;
			bad_cnt[0]++;
			if(rig<2*n-1) bad_cnt[rig+1]--;
		}
	};

	auto dis=[&](ll f, ll s){
		if(f<s){
			return s-f;
		}
		else{
			return s+2*n-f;
		}
	};

	auto end_to_start=[&](ll tar){
		ll re=tar-n+1+2*n;
		re%=2*n;
		return re;
	};

	auto check=[&](ll diff){
		memset(pos, 0, sizeof(pos));
		for(ll rep=0;rep<2;rep++){
			// cout<<"rep: "<<rep<<'\n';
			bad_cnt=vll(2*n, 0);
			for(ll i=0;i<n;i++){
				// cout<<"considering "<<i<<'\n';
				pll p=qry(a[i], diff, rep);
				// cout<<"range: "<<p.F<<' '<<p.S<<'\n';
				if(p.F==n){
					mark((i-n+1+2*n)%(2*n), i);
				}
				else{
					ll tep=dumb(i);
					if(tep==2*n){
						if(p.F>i){
							mark((i-n+1+2*n)%(2*n), i);
						}
						else{
							if(p.S<i){
								if(i-p.S-1>=i-n+1) mark((i-n+1+2*n)%(2*n), (i-p.S-1+2*n)%(2*n));
							}
							if(p.F>0){
								if(i-p.F+1>=i-n+1) mark(((i-p.F+1+2*n)%(2*n)), i);
								else mark((i-n+1+2*n)%(2*n), i);
							}
						}
						continue;
					}
					ll d=dis(tep, i);
					if(d<p.F){
						mark((i-n+1+2*n)%(2*n), i);
					}
					else{
						if(p.F>0){
							if(tep<=i+n-1 && i+n-tep>=p.F){

							}
							else{
								// cout<<"hi2\n";
								if(i-p.F+1>=i-n+1) mark(((i-p.F+1+2*n)%(2*n)), i);
								else mark((i-n+1+2*n)%(2*n), i);
							}
						}
						if(p.S<d){
							ll bk=tep-n+1;
							if(bk<=i && i-bk+1>p.S){
								mark((i-n+1+2*n)%(2*n), i);
							}
							else{
								// cout<<"hi\n";
								if(i-p.S-1>=i-n+1) mark((i-n+1+2*n)%(2*n), (i-p.S-1+2*n)%(2*n));
							}
						}
					}
				}
			}
			for(ll i=n;i<2*n;i++){
				// cout<<"considering "<<i<<'\n';
				pll p=qry(a[i], diff, rep);
				// cout<<"range: "<<p.F<<' '<<p.S<<'\n';
				if(p.F==n){
					mark((i-n+1+2*n)%(2*n), i);
				}
				else{
					ll tep=dumb(i);
					if(tep==-1){
						if(p.F>2*n-1-i){
							mark((i-n+1+2*n)%(2*n), i);
						}
						else{
							if(p.F>0){
								mark(end_to_start(i), end_to_start((i+p.F-1)%(2*n)));
							}
							if(p.S<2*n-1-i){
								mark(end_to_start((i+p.S+1)%(2*n)), i);
							}
						}
						continue;
					}
					ll d=dis(i, tep);
					// cout<<"d: "<<d<<'\n';
					if(d<p.F){
						mark((i-n+1+2*n)%(2*n), i);
					}
					else{
						if(p.F>0){
							ll st=end_to_start(i);
							if(st<=tep && tep-st+1>=p.F){

							}
							else{
								if(i+p.F-1<=i+n-1) mark(end_to_start(i), end_to_start((i+p.F-1)%(2*n)));
								else mark((i-n+1+2*n)%(2*n), i);
							}
							
						}
						if(p.S<d){
							ll st=end_to_start(i);
							if(st<=tep && tep-st+1>p.S){
								mark((i-n+1+2*n)%(2*n), i);
							}
							else{
								// cout<<"hi3\n";
								if(i+p.S+1<=i+n-1) mark(end_to_start((i+p.S+1)%(2*n)), i);
							}
							
						}
					}
				}
			}
			if(bad_cnt[0]==0){
				pos[0][rep]=1;
			}
			for(ll i=1;i<2*n;i++){
				bad_cnt[i]+=bad_cnt[i-1];
				if(bad_cnt[i]==0){
					pos[i][rep]=1;
				}
			}
			// cout<<"_______________\n";
		}
		for(ll i=0;i<n;i++){
			if((pos[i][0] && pos[i+n][1]) || (pos[i][1] && pos[i+n][0])){
				return true;
			}
		}
		return false;
	};

	// bool tep=check(2);

	// cout<<"tep: "<<tep<<'\n';

	ll lef=0, rig=1e9+5;
	ll ans=-1;
	while(lef<=rig){
		ll mid=(lef+rig)/2;
		if(check(mid)){
			ans=mid;
			rig=mid-1;
		}
		else{
			lef=mid+1;
		}
	}

	cout<<ans<<'\n';
}

int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	solve();

	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...