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.util.Scanner

import java.io._
import java.nio.file.Files._
import java.nio.file.Path
import java.util.StringTokenizer

import scala.collection.Searching._
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)
    val B = Array.fill(M)(sc.nextLong())
    println(A.search(B(0)) match {
      case InsertionPoint(i) => sumOfA(i) + (N - i) * 1
      case Found(i) => sumOfA(i) + (N - i) * 1
      case _ => 1
    })
    /*
    println(Array.fill(M)(sc.nextLong()).map(b => A.search(b) match {
      case InsertionPoint(i) => sumOfA(i) + (N - i) * b
      case Found(i) => sumOfA(i) + (N - i) * b
      case _ => 1
    }).sum)
    */
  }

  def main(args: Array[String]): Unit = {
    val sc: Scanner = new Scanner(System.in)
    solve(sc)
  }
}

/*


class IUnionFind(val size: Int) {

private case class Node(var parent: Option[Int], var treeSize: Int)

private val nodes = Array.fill[Node](size)(Node(None, treeSize = 1))

def union(t1: Int, t2: Int): IUnionFind = {
  if (t1 == t2) return this

  val root1 = root(t1)
  val root2 = root(t2)
  if (root1 == root2) return this

  val node1 = nodes(root1)
  val node2 = nodes(root2)

  if (node1.treeSize < node2.treeSize) {
    node1.parent = Some(t2)
    node2.treeSize += node1.treeSize
  } else {
    node2.parent = Some(t1)
    node1.treeSize += node2.treeSize
  }
  this
}

def connected(t1: Int, t2: Int): Boolean = t1 == t2 || root(t1) == root(t2)

def root(t: Int): Int = nodes(t).parent match {
  case None => t
  case Some(p) =>
    nodes(t).parent = Some(root(p))
    nodes(t).parent.get
}
}



def getPermutation(begin: Long = 0): Stream[Long] =
  Stream.cons(begin, getPermutation(begin + 1))

def calc(N: Long, R: Long, M: Long): Double = {
  math.sqrt(R * R - (R * 2 * ((M * 1.0 / N) - 0.5)) * (R * 2 * ((M * 1.0 / N) - 0.5))) * 2
}

def recursive(N1: Long, N2: Long, M1: Long, M2: Long): Long = {
  println(N1, N2, M1, M2)
  if (N1 + N2 == 0 || M1 + M2 == 0) -1
  else recursive(math.max(0, M1 - math.max(0, N1 + N2 - M2) / 2), math.max(0, M2 - N1 - N2) + math.max(0, N1 + N2 - M2) % 2, N1, N2) + 1
}

def check(s: String): Boolean = {
  if (s == "0") true
  else s(0) != '0' && 0 <= s.toInt && s.toInt <= 255
}

def shift(n: Long): Long = {
  if (n == 0) 0
  else if (n == 1) 1
  else shift(n - 1) << 1
}

def unShift(n: Long): Long = {
  if (n == 0) 0
  else unShift(n >> 1) + 1
}

def gcd(i: Long, j: Long): Long = {
  if (i < j) gcd(j, i)
  else if (j == 0) i
  else gcd(j, i % j)
}

def main(args: Array[String]): Unit = {
  val sc: Scanner = new Scanner(System.in)
  solve(sc)
}
}

object Util {
def getPermutation(begin: Long = 0): Stream[Long] =
  Stream.cons(begin, getPermutation(begin + 1))

def getPrimeList: Stream[Long] =
  getPrimeListRecursive(getPermutation(begin = 2))

private def getPrimeListRecursive(A: Stream[Long]): Stream[Long] =
  Stream.cons(A.head, getPrimeListRecursive(A.tail.filter(_ % A.head != 0)))

def fib(a: Long = 0, b: Long = 1, mod: Long = Long.MaxValue): Stream[Long] = a #:: fib(b % mod, (a + b) % mod, mod)
}

object ArabicRoman {

type =?>[A, B] = PartialFunction[A, B]

val codeTable = List(
  (1000, "M"), (900, "CM"), (500, "D"), (400, "CD"), (100, "C"),
  (90, "XC"), (50, "L"), (40, "XL"), (10, "X"), (9, "IX"), (5, "V"), (4, "IV"), (1, "I"))

val arabicToRoman: Int =?> String = {
  case src if src >= 1 && src <= 3999 => {

    def convert(left: Int, cont: String = "", code: List[(Int, String)] = codeTable): String = {
      val (unitVal, unitChar) = code.head
      left - unitVal match {
        case n if n == 0 => cont + unitChar
        case n if n > 0 => convert(n, cont + unitChar, code)
        case _ => convert(left, cont, code.tail)
      }
    }

    convert(src)
  }
}

val romanToArabic: String =?> Int = {
  case src if Option(src).exists { s => {
    s.nonEmpty && """[^MDCLXVI]""".r.findFirstMatchIn(s.toUpperCase).isEmpty
  }
  } =>

    def convert(left: String, cont: Int = 0, code: List[(Int, String)] = codeTable): Int = {
      val (unitVal, unitChar) = code.head
      left.splitAt(unitChar.length) match {
        case ("", _) => cont
        case (`unitChar`, tail) => convert(tail, cont + unitVal, code)
        case _ => convert(left, cont, code.tail)
      }
    }

    convert(src.toUpperCase())
}
}
*/