Submission #1276767

#TimeUsernameProblemLanguageResultExecution timeMemory
1276767boclobanchatGrowing Vegetables is Fun 5 (JOI24_vegetables5)C++20
100 / 100
948 ms20468 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXN=6e5+5;
const int INF=1e9;
int A[MAXN],B[MAXN],C[MAXN],L[MAXN],R[MAXN],st[MAXN];
int pf[MAXN],ps[MAXN],p[MAXN],pref[MAXN];
int qf[MAXN],qs[MAXN],q[MAXN],qref[MAXN];
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n;
	cin>>n;
	for(int i=0;i<n*2;i++) cin>>A[i];
	for(int i=1;i<=n;i++) cin>>B[i];
	for(int i=1;i<=n;i++) cin>>C[i];
	sort(B+1,B+n+1);
	sort(C+1,C+n+1);
	int pt,lt,rt;
	B[0]=C[0]=-INF*2-7,B[n+1]=C[n+1]=INF*2+7;
	for(int i=0;i<n;i++) p[i]=q[i]=0,p[i+n]=q[i+n]=n+1;
	L[1]=R[1]=n,pf[1]=abs(B[n]-A[n]),qf[1]=abs(C[n]-A[n]);
	for(int i=2;i<=n;i++)
	{
		L[i]=L[i-1],R[i]=R[i-1];
		if(A[L[i]-1]>A[R[i]+1])
		{
			L[i]--;
			pf[i]=max(pf[i-1],abs(B[n-i+1]-A[L[i]]));
			qf[i]=max(qf[i-1],abs(C[n-i+1]-A[L[i]]));
		}
		else
		{
			R[i]++;
			pf[i]=max(pf[i-1],abs(B[n-i+1]-A[R[i]]));
			qf[i]=max(qf[i-1],abs(C[n-i+1]-A[R[i]]));
		}
	}
	pt=1;
	for(int i=1;;i++)
	{
		while(i<=L[pt]&&R[pt]<=i+n-1) pt++;
		pt--,ps[i]=pf[pt],qs[i]=qf[pt];
		if(i==1) rt=L[pt]-1;
		else
		{
			p[i-1]=i-1;
			while(rt>=L[pt]) p[rt--]=i-1;
		}
		if(pt==n) break;
		pt++;
	}
	pt=1;
	for(int i=n;;i--)
	{
		while(i<=L[pt]&&R[pt]<=i+n-1) pt++;
		pt--,ps[i]=pf[pt],qs[i]=qf[pt];
		if(i==n) lt=R[pt]+1;
		else
		{
			while(lt<=R[pt]) p[lt++]=i+1;
			p[i+n]=i+1;
		}
		if(pt==n) break;
		pt++;
	}
	L[1]=R[1]=n,pf[1]=abs(C[1]-A[0]),qf[1]=abs(B[1]-A[0]);
	for(int i=2;i<=n;i++)
	{
		L[i]=L[i-1],R[i]=R[i-1];
		if(A[L[i]-1+n]<A[R[i]+1-n])
		{
			L[i]--;
			pf[i]=max(pf[i-1],abs(C[i]-A[L[i]+n]));
			qf[i]=max(qf[i-1],abs(B[i]-A[L[i]+n]));
		}
		else
		{
			R[i]++;
			pf[i]=max(pf[i-1],abs(C[i]-A[R[i]-n]));
			qf[i]=max(qf[i-1],abs(B[i]-A[R[i]-n]));
		}
	}
	pt=1;
	for(int i=1;;i++)
	{
		while(i<=L[pt]&&R[pt]<=i+n-1) pt++;
		pt--,ps[i]=max(ps[i],pf[pt]),qs[i]=max(qs[i],qf[pt]);
		if(i==1) rt=L[pt]-1;
		else
		{
			q[i-1]=i-1;
			while(rt>=L[pt]) q[rt--]=i-1;
		}
		if(pt==n) break;
		pt++;
	}
	pt=1;
	for(int i=n;;i--)
	{
		while(i<=L[pt]&&R[pt]<=i+n-1) pt++;
		pt--,ps[i]=max(ps[i],pf[pt]),qs[i]=max(qs[i],qf[pt]);
		if(i==n) lt=R[pt]+1;
		else
		{
			while(lt<=R[pt]) q[lt++]=i+1;
			q[i+n]=i+1;
		}
		if(pt==n) break;
		pt++;
	}
	for(int i=1;i<n;i++) st[1]++,st[p[i]+1]--;
	for(int i=n*2-1;i>n;i--) st[p[i]]++;
	for(int i=1;i<n;i++) st[1]++,st[q[i]+1]--;
	for(int i=n*2-1;i>n;i--) st[q[i]]++;
	int l=0,r=INF,ans=INF,ll,rr,vx,vy,l1,r1,l2,r2;
	while(l<=r)
	{
		int mid=(l+r)/2;
		for(int i=0;i<=n+1;i++) pref[i]=qref[i]=st[i];
		l1=r1=l2=r2=1;
		for(int i=1;i<n;i++)
		{
			vx=A[i]-mid,vy=A[i]+mid;
			while(B[l1]<vx) l1++;
			while(B[r1]<=vy) r1++;
			while(C[l2]<vx) l2++;
			while(C[r2]<=vy) r2++;
			ll=max(i-r1+2,1),rr=min(i-l1+1,p[i]);
			if(ll<=rr) pref[ll]--,pref[rr+1]++;
			ll=max(i-r2+2,1),rr=min(i-l2+1,p[i]);
			if(ll<=rr) qref[ll]--,qref[rr+1]++;
		}
		l1=r1=l2=r2=1;
		for(int i=n*2-1;i>n;i--)
		{
			vx=A[i]-mid,vy=A[i]+mid;
			while(B[l1]<vx) l1++;
			while(B[r1]<=vy) r1++;
			while(C[l2]<vx) l2++;
			while(C[r2]<=vy) r2++;
			ll=max(i-n+l1,p[i]),rr=min(i-n+r1-1,n);
			if(ll<=rr) pref[ll]--,pref[rr+1]++;
			ll=max(i-n+l2,p[i]),rr=min(i-n+r2-1,n);
			if(ll<=rr) qref[ll]--,qref[rr+1]++;
		}
		l1=r1=l2=r2=n;
		for(int i=1;i<n;i++)
		{
			vx=A[i+n]-mid,vy=A[i+n]+mid;
			while(C[r1]>vy) r1--;
			while(C[l1]>=vx) l1--;
			while(B[r2]>vy) r2--;
			while(B[l2]>=vx) l2--;
			ll=max(i-n+l1+1,1),rr=min(i-n+r1,q[i]);
			if(ll<=rr) pref[ll]--,pref[rr+1]++;
			ll=max(i-n+l2+1,1),rr=min(i-n+r2,q[i]);
			if(ll<=rr) qref[ll]--,qref[rr+1]++;
		}
		l1=r1=l2=r2=n;
		for(int i=n*2-1;i>n;i--)
		{
			vx=A[i-n]-mid,vy=A[i-n]+mid;
			while(C[r1]>vy) r1--;
			while(C[l1]>=vx) l1--;
			while(B[r2]>vy) r2--;
			while(B[l2]>=vx) l2--;
			ll=max(i-r1+1,q[i]),rr=min(i-l1,n);
			if(ll<=rr) pref[ll]--,pref[rr+1]++;
			ll=max(i-r2+1,q[i]),rr=min(i-l2,n);
			if(ll<=rr) qref[ll]--,qref[rr+1]++;
		}
		bool e=false;
		for(int i=1;i<=n;i++) e|=(!(pref[i]+=pref[i-1])&&ps[i]<=mid)|(!(qref[i]+=qref[i-1])&&qs[i]<=mid);
		if(e) r=mid-1,ans=mid;
		else l=mid+1;
	}
	cout<<ans;
}
#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...