unittest
{
	assert( [ "2 2", "3", "5", "2", "7" ].parse.expand.solve == 29 );
	assert( [ "4 3", "2", "4", "8", "1", "2", "9", "3" ].parse.expand.solve == 60 );
}



import std.algorithm;
import std.conv;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto wh = input.front.split.to!( long[] );
	auto cs = new Tuple!( long, bool )[ wh[ 0 ] + wh[ 1 ] ];
	foreach( ref c; cs[ 0 .. wh[ 0 ] ] )
	{
		input.popFront;
		c = tuple( input.front.to!( long ), false );
	}
	foreach( ref c; cs[ wh[ 0 ] .. $ ] )
	{
		input.popFront;
		c = tuple( input.front.to!( long ), true );
	}
	return tuple( wh[ 0 ], wh[ 1 ], cs );
}

auto solve( long w, long h, Tuple!( long, bool )[] cs )
{
	// コストの少ない道から順に舗装する
	auto ans = 0L;
	w++;
	h++;
	foreach( c; cs.sort() )
	{
		if( c[ 1 ] )
		{
			// 縦の道
			ans += c[ 0 ] * w;
			h--;		// 舗装した道の両端の家は、後続処理では同一視してよい
		}
		else
		{
			// 横の道
			ans += c[ 0 ] * h;
			w--;		// 舗装した道の両端の家は、後続処理では同一視してよい
		}
	}
	return ans;
}
