#include <bits/stdc++.h>
#define L(i, j, k) for(int i = (j); i <= (k); i++)
#define R(i, j, k) for(int i = (j); i >= (k); i--)
#define sz(a) ((int) a.size())
#define pb emplace_back
#define me(a, x) memset(a, x, sizeof(a))
#define fst first
#define snd second
using namespace std;
typedef long long ll;
const int N=2e5+5;
const ll INF=1e18;
void chmin(ll &a,ll b){
a=min(a,b);
}
long long min_total_length(std::vector<int> r, std::vector<int> b) {
vector<vector<ll>>grupos;
vector<pair<ll,bool>>cord;
L(i,0,sz(r)-1){
cord.pb(r[i],0);
}
L(i,0,sz(b)-1){
cord.pb(b[i],1);
}
sort(cord.begin(),cord.end());
grupos.pb(vector<ll>(0));
L(i,0,sz(cord)-1){
if(i&&cord[i].snd!=cord[i-1].snd){
grupos.pb(vector<ll>(0));
}
grupos.back().pb(cord[i].fst);
}
vector<ll>dp(sz(grupos[0])+1,INF);
dp[0]=0;
//~ cout<<"PASS"<<endl;
L(g,1,sz(grupos)-1){
auto &blk=grupos[g];
auto &prevBlk=grupos[g-1];
int n=sz(blk),m=sz(prevBlk);
ll middle=blk.front()-prevBlk.back();
//~ cout<<"PASS2"<<endl;
//tengo para cada prefijo y sufijo cuanta es la distancia hacia el "borde"
vector<ll>suff(m+1),pref(n+1);
L(i,0,n-1){
pref[i+1]+=pref[i]+blk[i]-blk.front();
}
R(i,m-1,0){
suff[i]+=suff[i+1]+prevBlk.back()-prevBlk[i];
}
//~ cout<<"PASS1"<<endl;
//ahora necesito tomar en cuenta los casos en los cuales mi sz(prev)>sz(act)
//o viceversa
vector<ll>izqMayor(m+1,INF),derMayor(m+1,INF);
L(i,0,m){
izqMayor[i]=dp[m-i]+suff[m-i];
derMayor[i]=dp[m-i]+suff[m-i]+1ll*i*middle;
}
L(i,1,m)chmin(izqMayor[i],izqMayor[i-1]);
R(i,m-1,0)chmin(derMayor[i],derMayor[i+1]);
vector<ll>ndp(n+1,INF);
L(i,0,n){
//considerar los tamaños de los bloques
if(i>=m)chmin(ndp[i],1ll*i*middle+izqMayor[m]+pref[i]);
else chmin(ndp[i],1ll*i*middle+izqMayor[i]+pref[i]);
if(i<m){
chmin(ndp[i],derMayor[i+1]+pref[i]);
}
}
swap(dp,ndp);
}
return dp.back();
}