#include "wiring.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
using vi = vector<int>;
ll min_total_length(vi r, vi b) {
set<int> red, blue;
ll ans = 0;
int i = 0, j = 0;
while (i < r.size() && j < b.size()) {
if (r[i] < b[j]) {
if (!blue.empty()) {ans += r[i++] - *blue.begin(); blue.erase(*blue.begin());}
else red.insert(r[i++]);
} else {
if (!red.empty()) {ans += b[j++] - *red.begin(); red.erase(*red.begin());}
else blue.insert(b[j++]);
}
}
while (i < r.size()) {
if (!blue.empty()) {ans += r[i++] - *blue.begin(); blue.erase(*blue.begin());}
else ans += r[i++] - b.back();
}
while (j < b.size()) {
if (!red.empty()) {ans += b[j++] - *red.begin(); red.erase(*red.begin());}
else ans += b[j++] - r.back();
}
while (!red.empty()) {
int x = *red.begin(); red.erase(x);
auto it = lower_bound(b.begin(), b.end(), x);
int u = INT_MAX;
if (it != b.end()) u = min(u, abs(*it - x));
else if (it != b.begin()) --it, u = min(u, abs(*it - x));
ans += u;
}
while (!blue.empty()) {
int x = *blue.begin(); blue.erase(x);
auto it = lower_bound(r.begin(), r.end(), x);
int u = INT_MAX;
if (it != r.end()) u = min(u, abs(*it - x));
else if (it != r.begin()) --it, u = min(u, abs(*it - x));
ans += u;
}
return ans;
}