#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAXN = 6e5 + 5;
const ll MAX = 1e18;
const ll MAXBINSER = 1e9;
ll n, ntot, ans = MAX, val[MAXN], red[MAXN], blue[MAXN];
ll offIn[MAXN], offOut[MAXN], posOut[MAXN], posIn[MAXN];
unordered_map<ll,ll> occur;
void precomp() {
vector<ll> L, R;
for (int i = 1; i <= n; ++i) {
L.push_back(val[i]);
}
for (int i = ntot; i >= n+1; --i) {
R.push_back(val[i]);
}
for (int i = 1; i <= n; ++i) {
// Leftmost yang >= val
offIn[i] = lower_bound(R.begin(), R.end(), val[i]) - R.begin();
offIn[i] = n-offIn[i];
}
for (int i = n+1; i <= ntot; ++i) {
posIn[i] = upper_bound(L.begin()+(i-n-1), L.end(), val[i]) - (L.begin()+(i-n-1));
// Never Zero due to Constrain
offIn[i] = i-n-1+posIn[i];
// cout << i << " | " << offIn[i] << " " << posIn[i] << "||\n";
// cout << offIn[i] << " " << posIn[i] << "|\n";
// occur[val[i]]++;
// Rightmost yang <= val
offOut[i] = upper_bound(L.begin(), L.end(), val[i]) - L.begin();
offOut[i] = offOut[i]+1;
}
}
ll diff[MAXN];
bool solve(ll x, ll arra[], ll arrb[]) {
memset(diff, 0, sizeof(diff));
for (ll i = 1; i <= ntot; ++i) {
// Search Range For val[i]
ll idl = lower_bound(arra+1, arra+1+n, val[i]-x) - arra;
ll idr = upper_bound(arra+1, arra+1+n, val[i]+x) - arra;
if(idl > n || idr == 1 || idl >= idr) {
idl = -1;
idr = 0;
}
idr--;
ll idl2 = lower_bound(arrb+1, arrb+1+n, val[i]-x) - arrb;
ll idr2 = upper_bound(arrb+1, arrb+1+n, val[i]+x) - arrb;
if(idl2 > n || idr2 == 1 || idl2 >= idr2) {
idl2 = -1;
idr2 = 0;
}
idr2--;
// cout << i << " " << x << "| [" << idl << "," << idr << "] [" << idl2 << "," << idr2 << "]\n";
ll l, r;
if (i <= n) {
// In
if(idl != -1) {
l = max((ll)1, i+1-idr);
r = min(offIn[i], i+1-idl)+1;
diff[l]++;
diff[r]--;
// cout << l << " " << r << " <> ";
if(i+1-idl > offIn[i] && abs(val[i] - arra[i+1-offIn[i]]) <= x) {
l = offIn[i]+1;
r = i+1;
diff[l]++;
diff[r]--;
}
}
// Out
if(abs(val[i]-arrb[i]) <= x) {
l = i+1;
r = n+1;
diff[l]++;
diff[r]--;
// cout << l << " " << r << "|\n";
}
// // l <= offOut[i]
// if(abs(val[i]-arrb[posOut[i]]) <= x) {
// l = i+1;
// r = posOut[i]+1;
// diff[l]++;
// diff[r]--;
// }
// // l > offOut[i]
// if(idl2 != -1) {
// l = max(posOut[i]+1, );
// r = min(n, )+1;
// diff[l]++;
// diff[r]--;
// }
} else {
// In
// if(abs(val[i]-arra[ntot-i+1]) <= x) {
// l = i-n+1;
// r = n+1;
// diff[l]++;
// diff[r]--;
// // cout << l << " " << r << " <> ";
// }
// __/
// l <= offIn[i]
if(offIn[i] >= i-n+1 && abs(val[i]-arra[posIn[i]]) <= x) {
l = i-n+1;
r = offIn[i]+1;
diff[l]++;
diff[r]--;
}
// l > offIn[i]
if(offIn[i] < n && idl != -1) {
l = max(posIn[i]+1, idl+offIn[i]-posIn[i]);
r = min(n, idr+offIn[i]-posIn[i])+1;
diff[l]++;
diff[r]--;
}
// Out
if(idl2 != -1) {
l = max((ll)1, idl2+i-ntot);
r = min(offOut[i], idr2+i-ntot)+1;
diff[l]++;
diff[r]--;
// cout << l << " " << r << "|\n";
if (idr2+i-ntot > offOut[i] && abs(val[i] - arrb[offOut[i]+i-ntot]) <= x) {
l = offOut[i]+1;
r = i-n+1;
diff[l]++;
diff[r]--;
}
}
}
}
// ------
ll cur = 0;
for (int i = 1; i <= ntot; ++i) {
cur += diff[i];
if(cur == ntot) {return true;}
}
return false;
}
int main() {
cin >> n;
ntot = 2*n;
for (int i = 1; i <= ntot; ++i) {
cin >> val[i];
}
for (int i = 1; i <= n; ++i) {
cin >> red[i];
}
for (int i = 1; i <= n; ++i) {
cin >> blue[i];
}
sort(red+1, red+1+n);
sort(blue+1, blue+1+n);
precomp();
// for (int i = 1; i <= n; ++i) {
// cout << red[i] << " ";
// } cout << "|\n";
// for (int i = 1; i <= n; ++i) {
// cout << blue[i] << " ";
// } cout << "|\n";
ll l = 0, r = MAXBINSER;
while(l <= r) {
ll mid = (l+r) >> 1;
// cout << "---------" << mid << "--------\n";
if(solve(mid, red, blue) || solve(mid, blue, red)) {
ans = mid;
r = mid-1;
} else {
l = mid+1;
}
}
cout << ans << "\n";
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |