#include using namespace std; typedef long long int ll; typedef pair P; typedef vector VI; typedef vector VVI; #define REP(i,n) for(ll i=0;i<(n);i++) #define ALL(v) v.begin(),v.end() template bool chmax(T &x, const T &y) {return (x bool chmin(T &x, const T &y) {return (x>y)?(x=y,true):false;}; constexpr ll MOD=1000000007; constexpr ll INF=2e18; struct Unionfind{ vector par, siz; Unionfind(int N):par(N), siz(N,1){ for(int i=0;i> n >> m; VI a(n), b(m); REP(i,n) cin >> a[i]; REP(i,m) cin >> b[i]; vector

p; REP(i,n) p.push_back({a[i],0}); REP(i,m) p.push_back({b[i],1}); sort(ALL(p)); vector

q; REP(i,n+m-1){ if(!(p[i].second==0&&p[i+1].second==0)){ q.push_back({p[i+1].first-p[i].first,i}); } } sort(ALL(q)); Unionfind uf(n+m); VI f(n+m,0); REP(i,n+m){ if(p[i].second==0) f[i]=1; } ll ans=0; for(auto [d,x]:q){ int r1=uf.root(x), r2=uf.root(x+1); if(f[r1]&&f[r2]) continue; else if(f[r1]||f[r2]){ f[r1]=1; f[r2]=1; uf.unite(r1,r2); ans+=d; } else{ uf.unite(r1,r2); ans+=d; } } cout << ans << endl; return 0; }