제출 #1276422

#제출 시각아이디문제언어결과실행 시간메모리
1276422boclobanchatGrowing Vegetables is Fun 5 (JOI24_vegetables5)C++20
100 / 100
989 ms20528 KiB
#include<iostream> #include<algorithm> using namespace std; const int MAXN=3e5+5; const int base=(1<<15)-1; const int INF=1e9; int A[MAXN*2],D[MAXN*2],B[MAXN],C[MAXN],L[MAXN],R[MAXN],pref[MAXN],pf[MAXN],p[MAXN*2],q[MAXN*2],ps[MAXN],st[MAXN]; struct countingsort { int cnt[(1<<15)+15],curr[MAXN]; void csort(int arr[],int n) { for(int i=1;i<=n;i++) cnt[arr[i]&base]++; for(int i=1;i<=base;i++) cnt[i]+=cnt[i-1]; for(int i=n;i;i--) curr[cnt[arr[i]&base]--]=arr[i]; for(int i=1;i<=base;i++) cnt[i]=0; for(int i=1;i<=n;i++) cnt[curr[i]>>15]++; for(int i=1;i<base;i++) cnt[i]+=cnt[i-1]; for(int i=n;i;i--) arr[cnt[curr[i]>>15]--]=curr[i]; for(int i=1;i<base;i++) cnt[i]=0; } }; countingsort f; int solve(int n) { 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*2;i++) p[i]=q[i]=st[i]=0; for(int i=0;i<n;i++) D[i]=A[i+n],D[i+n]=A[i]; L[1]=R[1]=n,pf[1]=abs(B[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]])); else R[i]++,pf[i]=max(pf[i-1],abs(B[n-i+1]-A[R[i]])); } pt=1; for(int i=1;;i++) { while(i<=L[pt]&&R[pt]<=i+n-1) pt++; ps[i]=pf[--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++; ps[i]=pf[--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]-D[n]); for(int i=2;i<=n;i++) { L[i]=L[i-1],R[i]=R[i-1]; if(D[L[i]-1]<D[R[i]+1]) L[i]--,pf[i]=max(pf[i-1],abs(C[i]-D[L[i]])); else R[i]++,pf[i]=max(pf[i-1],abs(C[i]-D[R[i]])); } pt=1; for(int i=1;;i++) { while(i<=L[pt]&&R[pt]<=i+n-1) pt++; ps[i]=max(ps[i],pf[--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++; ps[i]=max(ps[i],pf[--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++; } int l=0,r=0,ans=INF,ll,rr; for(int i=1;i<=n;i++) r=max(r,ps[i]); for(int i=1;p[i];i++) st[1]++,st[p[i]+1]--; for(int i=n*2-1;p[i];i--) st[p[i]]++,st[n+1]--; for(int i=1;q[i];i++) st[1]++,st[q[i]+1]--; for(int i=n*2-1;q[i];i--) st[q[i]]++,st[n+1]--; while(l<=r) { int mid=l+(r-l)/2; lt=rt=1; for(int i=0;i<=n+1;i++) pref[i]=st[i]; for(int i=1;p[i];i++) { while(B[lt]+mid<A[i]) lt++; while(B[rt]-mid<=A[i]) rt++; ll=max(i-rt+2,1),rr=min(i-lt+1,p[i]); if(ll<=rr) pref[ll]--,pref[rr+1]++; } lt=rt=1; for(int i=n*2-1;p[i];i--) { while(B[lt]+mid<A[i]) lt++; while(B[rt]-mid<=A[i]) rt++; ll=max(i-n+lt,p[i]),rr=min(i-n+rt-1,n); if(ll<=rr) pref[ll]--,pref[rr+1]++; } lt=rt=n; for(int i=1;q[i];i++) { while(C[rt]-mid>D[i]) rt--; while(C[lt]+mid>=D[i]) lt--; ll=max(i+lt-n+1,1),rr=min(i-n+rt,q[i]); if(ll<=rr) pref[ll]--,pref[rr+1]++; } lt=rt=n; for(int i=n*2-1;q[i];i--) { while(C[rt]-mid>D[i]) rt--; while(C[lt]+mid>=D[i]) lt--; ll=max(i-rt+1,q[i]),rr=min(i-lt,n); if(ll<=rr) pref[ll]--,pref[rr+1]++; } bool e=false; for(int i=1;i<=n;i++) e|=(!(pref[i]+=pref[i-1])&&ps[i]<=mid); if(e) r=mid-1,ans=mid; else l=mid+1; } return ans; } 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]; f.csort(B,n); f.csort(C,n); int ans=solve(n); swap(B,C); ans=min(ans,solve(n)); 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...