二分其实很好考虑对吧,时间越多,满足的越多,如何judge呢,这个仔细想想还是挺有意思的.
1.左边的人拿左边的钥匙能在这个时间段满足,那就满足,对于整体方案来说是最优的
2.如果左边的对于某把钥匙不满足,之后出现了某个位置钥匙满足,那么之前那把钥匙一定是在这个人的左边,那么进而证明右边的人也一定不会用到这把不满足的钥匙.
//#pragma comment(linker, "/STACK:102400000,102400000")
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
typedef long long LL;
const int Maxn = 2e3 + 7;
int n, k;
LL a[Maxn], b[Maxn], p;
bool Judge(LL Max){
bool flag;
int j=0;
for(int i=0;i<n;i++){
flag = false;
while(j<k){
if((abs(a[i]-b[j]) + abs(b[j]-p)) <= Max){
flag = true;
j++;
break;
}
j++;
}
if(!flag) return false;
}
return true;
}
void solve(){
LL Left = 0, Right = 1e14;
while(Left < Right){
LL mid = Left + (Right - Left) / 2;
if(Judge(mid)) Right = mid;
else Left = mid + 1;
}
printf("%I64d\n", Left);
}
int main(){
scanf("%d%d%I64d", &n, &k, &p);
for(int i=0;i<n;i++) scanf("%I64d", &a[i]);sort(a, a+n);
for(int i=0;i<k;i++) scanf("%I64d", &b[i]);sort(b, b+k);
solve();
return 0;
}