Problem:
MathJax.Hub.Config({ tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]} });

B: 全日本帰りたい協会

問題

株式会社 AOR (Association Of Return home)には $N$ 人の社員がいる。

社員 $i$ はエレベーターを使って $1$ 階に下りたいと考えており、時刻 $t_i$ に $F_i$ 階のエレベーター前にやってくる。あなたは時刻 $0$ に $1$ 階に $1$ 基だけあるエレベーターを遠隔操作し、すべての社員を $1$ 階に送ることにした。エレベーターには $D$ 人までしか乗せられない。
エレベーターは単位時間に一階分移動するかその場にとどまる事ができる。 社員 $i$ はエレベーターが時刻 $t_i$ に $F_i$ 階にあって、自分が乗っても定員を超過しないときのみエレベーターに乗る。 時刻 $t_i$ にエレベーターに乗れないとき、階段で $1$ 階におりてしまう。 なお、乗り降りにかかる時間は無視できる。

それぞれの社員がエレベーターに乗っている時間の合計の最小値を求めよ。 ただし、エレベーターで $1$ 階へ運べない人が $1$ 人でもいる場合は $-1$ を出力せよ。

制約

$1 \le N \le 10^5$

$1 \le D \le 10^5$

$1 \le t_i \lt t_{i+1} \le 10^6$

$2 \le F_i \le 10^6$

入力は全て整数で与えらえる。

入力形式

入力は以下の形式で与えられる。

$N \ D$
$t_1 \ F_1$
$t_2 \ F_2$
$\vdots$
$t_N \ F_N$

出力

それぞれの社員がエレベーターに乗っている時間の合計の最小値を出力せよ。ただし、エレベーターで $1$ 階へ運べない人が $1$ 人でもいる場合は $-1$ を出力せよ。また、末尾に改行も出力せよ。

サンプル

サンプル入力 1

2 2
2 2
3 3

サンプル出力 1

5

サンプル入力 2

2 2
2 2
5 3

サンプル出力 2

3

サンプル入力 3

2 2
2 2
3 5

サンプル出力 3

-1

Solution in Scala (judge verdict: Wrong Answer)

object Main extends App {

  import scala.io.StdIn._
  import scala.math._


  val Array(n, d) = readLine.trim.split(' ').map(_.toInt)
  val clue = Array.tabulate(n){_ ⇒
    val Array(t, f) = readLine.trim.split(' ').map(_.toInt)
    Clue(t, f)
  }.sorted
  var passengers = 0
  var floor = 1
  var time = 1
  var sumTime: Long = 0L
  var useStair: Boolean = false
  for (c ← clue if !useStair){
    if (c.floor - 1 + floor - 1 <= c.time - time) {
      sumTime += (floor - 1) * passengers
      passengers = 0
      time += floor - 1
      floor = 1
    }
    if (math.abs(c.floor - floor) <= c.time - time && passengers < d){
      sumTime += (c.time - time) * passengers
      passengers += 1
      time = c.time
      floor = c.floor
    } else {
      useStair = true
    }
  }
  sumTime += passengers * (floor - 1)
  println(
    if (useStair) -1
    else sumTime
  )

  case class Clue(time: Int, floor: Int) extends Ordered[Clue] {
    override def compare(that: Clue): Int = time.compare(that.time)
  }

  implicit class Extension[T](val value :T){
    def also(func: T ⇒ Unit): T = {
      func(value)
      value
    }
    def let[R](func: T ⇒ R): R = func(value)
  }
}