#include "wiring.h"
#include <bits//stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef tree<long long, null_type, less<long long>, rb_tree_tag,
tree_order_statistics_node_update>
ordered_set;
typedef tree<long long, null_type, less_equal<long long>, rb_tree_tag,
tree_order_statistics_node_update>
ordered_multiset;
#define ll long long
#define iloop(m, h) for (auto i = m; i != h; i += (m < h ? 1 : -1))
#define jloop(m, h) for (auto j = m; j != h; j += (m < h ? 1 : -1))
#define kloop(m, h) for (auto k = m; k != h; k += (m < h ? 1 : -1))
#define lloop(m, h) for (auto l = m; l != h; l += (m < h ? 1 : -1))
#define pll pair<ll, ll>
#define INF 1000000000000000
#define MOD1 1000000007
#define MOD2 998244353
#define MOD3 1000000009
ll n, cr, cb, cr2, cb2, dp[200005];
ll ext, prv;
vector<pll> v;
vector<ll> vr, vb;
long long min_total_length(vector<int> r, vector<int> b) {
for (auto it : r) v.push_back({it, 0}), vr.push_back(it);
for (auto it : b) v.push_back({it, 1}), vb.push_back(it);
vr.push_back(-INF), vr.push_back(INF);
vb.push_back(-INF), vb.push_back(INF);
sort(v.begin(), v.end());
n = v.size();
sort(vr.begin(), vr.end());
sort(vb.begin(), vb.end());
cr = cr2 = cb = cb2 = 0;
dp[0] = 0;
ext = prv = 0;
iloop(1, n+1) {
if (v[i-1].second == 0) {
while (vb[cb] < v[i-1].first) cb++;
while (vb[cb2 + 1] < v[i-1].first) cb2++;
dp[i] = dp[i-1] + min(vb[cb] - v[i-1].first, v[i-1].first - vb[cb2]);
}
else {
while (vr[cr] < v[i-1].first) cr++;
while (vr[cr2 + 1] < v[i-1].first) cr2++;
dp[i] = dp[i-1] + min(vr[cr] - v[i-1].first, v[i-1].first - vr[cr2]);
}
//cout << dp[i] << ",";
if (i-1 && v[i-1].second != v[i-2].second) {
prv = i-1, ext = v[i-1].first - v[i-2].first; // pair last 2
dp[i] = min(dp[i], dp[i-2] + ext);
}
else if (prv-1 > 0 && v[prv-1].second == v[prv-1].second) {
prv--, ext += v[i-1].first - v[prv-1].first; // pair last 2k
dp[i] = min(dp[i], dp[prv-1] + ext);
}
else prv = 0;
//cout << dp[i] << " ";
}
return dp[n];
}