题目大意:
懒得讲了。
思路:
二分一个答案以后再去判断,一种神奇的判断是根据人和位置都必须要是连续的,所以下一个人的范围必须是要在前一个人的
到
,然后不断地求区间并集即可。
还有一种判断的方法就是Hall定理,可证明如果不符合,必定有一段连续的区间不满足Hall定理,所以我们就是要求最小的一段字串和,然后利用求最小连续字串和的办法来判断符不符合,同时注意这里的连续字串是在环上连续,注意处理。
/*========================
Author : ylsoi
Problem : CF981F
Algorithm : Hall
Time : 2018.8.2
=========================*/
#include<bits/stdc++.h>
#define REP(i,a,b) for(int i=a;i<=b;++i)
typedef long long ll;
using namespace std;
void File(){
freopen("CF981F.in","r",stdin);
freopen("CF981F.out","w",stdout);
}
const int maxn=2e5+10;
const ll mod=20000909;
const int inf=0x3f3f3f3f;
int n,L,a[maxn],b[maxn<<2];
int l[maxn],r[maxn];
ll qpow(ll x,ll y){
ll ret=1;
while(y){
if(y&1)ret=ret*x%mod;
x=x*x%mod;
y>>=1;
}
return ret;
}
bool judge(int lim){
REP(i,1,n){
l[i]=lower_bound(b+1,b+3*n+1,a[i]-lim)-b;
r[i]=upper_bound(b+1,b+3*n+1,a[i]+lim)-b;
--r[i];
if(l[i]>r[i])return false;
}
REP(i,2,n){
l[i]=max(l[i],l[i-1]+1);
r[i]=min(r[i],r[i-1]+1);
if(l[i]>r[i])return false;
}
return true;
}
bool judge_Hall(int lim){
REP(i,1,n){
l[i]=lower_bound(b+1,b+3*n+1,a[i]-lim)-b;
r[i]=upper_bound(b+1,b+3*n+1,a[i]+lim)-b;
--r[i];
if(l[i]>r[i])return false;
}
int Max=0;
REP(i,1,n){
Max=max(Max,l[i]-i);
if(r[i]-i<Max)return false;
}
return true;
}
int solve(){
#define mid ((left+right)>>1)
int left=0,right=L-1;
while(left+1<right){
if(judge(mid))right=mid;
else left=mid+1;
}
if(judge(left))return left;
else return right;
}
void init(){
scanf("%d%d",&n,&L);
REP(i,1,n)scanf("%d",&a[i]);
REP(i,1,n)scanf("%d",&b[i+n]);
sort(a+1,a+n+1);
sort(b+n+1,b+n*2+1);
REP(i,1,n)b[i]=b[i+n]-L;
REP(i,2*n+1,3*n)b[i]=b[i-n]+L;
}
int main(){
File();
init();
cout<<solve()<<endl;
return 0;
}