// CTEAM 039 // vdaka ;) #include #include #include #include void solveProblem() { int N; scanf( "%d", &N ); int a[N+1]; int b[N+1]; for( int i = 0; i < N; i++ ) scanf( "%d", &(a[i]) ); for( int i = 0; i < N; i++ ) scanf( "%d",&(b[i]) ); a[N]=b[N] = -1; std::sort( a, a+N, std::greater() ); std::sort( b, b+N, std::greater() ); int result_min = 0, result_max = 0; int j; for( int i = j = 0; i < N || j < N; ) { if( a[i] == b[j] ) { result_min += a[i++]; j++; }else if( a[i] > b[j] ) { result_min += a[i++]; } else { result_min += b[j++]; } } int ia,ib,ic,id; for( ia = ib = 0; ia < N || ib < N; ) { ic = ia; id = ib; if( a[ia] == b[ib] && ia < N && ib < N ) { do ic++; while( a[ia] == a[ic] ); do id++; while( b[ib] == b[id] ); result_max += a[ia] * ( (ic - ia ) * id + (id-ib)*ia ); // printf( "== %d\n", result_max ); ia = ic; ib = id; } else if( a[ia] > b[ib] && ia < N) { do ic++; while( a[ia] == a[ic] ); result_max += a[ia] * ( (ic - ia ) * ib ); // printf( "== %d\n", result_max ); ia = ic; } else { do id++; while( b[ib] == b[id] ); result_max += b[ib] * ( (id-ib)*ia ); // printf( "== %d\n", result_max ); ib = id; } } printf( "Minimalni budova obsahuje %d kostek, maximalni %d kostek.\n" ,result_min, result_max ); } int main() { int K; scanf( "%d", &K ); while( K-- ) { solveProblem(); } return 0; }