4-2

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
 
ll total_distance(const vector<int>& A, const vector<int>& B) 
{
    ll sum = 0;
    for (size_t i = 0; i < A.size(); ++i)
        sum += abs((ll)A[i] - B[i]);
    return sum;
}
 
int main() 
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
 
    int T;
    cin >> T;
 
    for (int tc = 1; tc <= T; ++tc) 
    {
        int N, R;
        cin >> N >> R;
 
        vector<int> blue_houses(N - R), red_houses(R);
        vector<int> blue_stores(N - R - 1), red_stores(R + 1);
 
        for (int& x : blue_houses) cin >> x;
        for (int& x : red_houses) cin >> x;
        for (int& x : blue_stores) cin >> x;
        for (int& x : red_stores) cin >> x;
 
        sort(blue_houses.begin(), blue_houses.end());
        sort(red_houses.begin(), red_houses.end());
        sort(blue_stores.begin(), blue_stores.end());
        sort(red_stores.begin(), red_stores.end());
 
        // 미리 blue_houses와 blue_stores를 정렬했으니,
        // red_stores 중 하나씩 넘겨주며 최소 비용 계산
        ll answer = LLONG_MAX;
 
        for (int i = 0; i < red_stores.size(); ++i) 
        {
            // 빨간 상점 i번을 파란 집에게 넘긴다
            vector<int> blue_s = blue_stores;
            blue_s.push_back(red_stores[i]);
 
            // 빨간 상점 중 i번 빼고 나머지를 red_s에 저장
            vector<int> red_s;
            red_s.reserve(R);
            for (int j = 0; j < red_stores.size(); ++j) 
            {
                if (j != i) red_s.push_back(red_stores[j]);
            }
 
            // 빨간 집 <--> 빨간 상점, 파란 집 <--> 나머지
            ll red_cost = total_distance(red_houses, red_s);
            sort(blue_s.begin(), blue_s.end());  // 이 한 줄만 실행
            ll blue_cost = total_distance(blue_houses, blue_s);
 
            answer = min(answer, red_cost + blue_cost);
        }
 
        cout << "Case #" << tc << endl << answer << endl;
    }
 
    return 0;
}