Problem:
N: 通販 (Mail Order)

胡桃沢さんは、魔界通販で積み木のおもちゃを買った。

積み木は一辺の長さが1の立方体の形をしており、縦に $H$ 個、横に $W$ 個に分割されたマス目の上に積まれている。

真横から見ると、左から順に、$A_1, A_2, A_3, \dots, A_H$ 個のブロックが積まれて見えた。

正面から見ると、左から順に、$B_1, B_2, B_3, \dots, B_W$ 個のブロックが積まれて見えた。

胡桃沢さんは偉大なので、これらの情報だけからブロックの総数を当てようと考えた。

小さい数を答えて間違えると格好悪いので、考えられる最大の個数を答えたい。

入力

1 行目には整数 $H, W$ が空白区切りで与えられる。

2 行目には、真横から見たときの図を表す $H$ 個の整数 $A_1, A_2, A_3, \dots, A_H$ が空白区切りで与えられる。

3 行目には、正面から見たときの図を表す $W$ 個の整数 $B_1, B_2, B_3, \dots, B_W$ が空白区切りで与えられる。

出力

これらの情報から考えられるブロックの個数の最大値を出力しなさい。

制約

$H, W$ は $1$ 以上 $100 \ 000$ 以下の整数

$A_1, A_2, A_3, \dots, A_H$ は $1$ 以上 $100 \ 000 \ 000$ 以下の整数

$B_1, B_2, B_3, \dots, B_W$ は $1$ 以上 $100 \ 000 \ 000$ 以下の整数

すべての入力に対して、条件を満たすブロックの積み方があることが保証される

入力例1

2 2
1 5
1 5

出力例1

8

縦方向に $X$ 番目、横方向に $Y$ 番目のマスを $(X, Y)$ で表すことにします。

マス $(2, 2)$ に5個、マス $(1, 1)$、$(1, 2)$、$(2, 1)$ に $1$ 個ずつ積まれていると合計 $8$ 個のブロックが積まれることになります。

$9$ 個以上積まれている可能性は無いので、答えは $8$ です。

入力例2

3 3
2 4 5
3 1 5

出力例2

22

Solution in Scala (judge verdict: Wrong Answer)

import java.io._
import java.nio.file.Files._
import java.nio.file.Path
import java.util.StringTokenizer
  
import scala.collection.immutable._
import scala.io.Codec
import scala.collection.Searching._
  
/**
  * Scala implementation of a faster java.util.Scanner
  * See: http://codeforces.com/blog/entry/7018
  */
  
class Scanner(reader: LineNumberReader) extends Iterable[String] with AutoCloseable {
  def this(reader: BufferedReader) = this(new LineNumberReader(reader))
  
  def this(reader: Reader) = this(new BufferedReader(reader))
  
  def this(inputStream: InputStream)(implicit codec: Codec) = this(new InputStreamReader(inputStream, codec.charSet))
  
  def this(path: Path)(implicit codec: Codec) = this(newBufferedReader(path, codec.charSet))
  
  def this(file: File)(implicit codec: Codec) = this(file.toPath)(codec)
  
  def this(str: String) = this(new StringReader(str))
  
  override def iterator: Iterator[String] = for {
    line <- Iterator.continually(reader.readLine()).takeWhile(_ != null)
    tokenizer = new StringTokenizer(line)
    tokens <- Iterator.continually(tokenizer).takeWhile(_.hasMoreTokens)
  } yield tokens.nextToken()
  
  private[this] var current = iterator
  
  def hasNext: Boolean = current.hasNext
  
  @inline def next(): String = current.next()
  
  /**
    * This is different from Java's scanner.nextLine
    * The Java one is a misnomer since it actually travel to end of current line
    * This one actually does fetch the next line
    */
  def nextLine(): String = {
    val line = reader.readLine()
    current = iterator
    line
  }
  
  def lineNumber: Int = reader.getLineNumber
  
  def nextString(): String = next()
  
  def nextBoolean(): Boolean = next().toBoolean
  
  def nextByte(radix: Int = 10): Byte = java.lang.Byte.parseByte(next(), radix)
  
  def nextShort(radix: Int = 10): Short = java.lang.Short.parseShort(next(), radix)
  
  def nextInt(radix: Int = 10): Int = java.lang.Integer.parseInt(next(), radix)
  
  def nextLong(radix: Int = 10): Long = java.lang.Long.parseLong(next(), radix)
  
  def nextBigInt(radix: Int = 10): BigInt = BigInt(next(), radix)
  
  def nextFloat(): Float = next().toFloat
  
  def nextDouble(): Double = next().toDouble
  
  def nextBigDecimal(): BigDecimal = BigDecimal(next())
  
  override def close(): Unit = reader.close()
}
  
object Main {
  
  def solve(sc: => Scanner): Unit = {
    val N, M = sc.nextInt()
    val A = Array.fill(N)(sc.nextLong()).sorted
    val sumOfA = A.scanLeft(0L)((a, b) => a + b)
 
    println(Array.fill(M)(sc.nextLong()).map(b => b).sum)
     
  }
  
  def main(args: Array[String]): Unit = {
    val sc: Scanner = new Scanner(System.in)
    solve(sc)
  }
}