Problem:
B - ライオン

あなたは動物園に来てライオンを見ている。
この動物園にはn個のライオンのオリがある。
あなたはライオンが全部で何頭いるのか知りたくなったのだが、
一人で数えるのは大変だ。
そこで近くにいた動物園の来園者m人に協力してもらうことにした。

ライオンのオリは、それぞれ1番からn番までの数字がついており、
順番に並んでいる。
一つのオリには0頭以上x頭以下のライオンがいる。

m人の来園者でi番目の人(1 ≤ i ≤ m)には
l_i番から
r_i番までの
両端を含むすべてのオリのライオンの数の総和を数えてもらった。

この情報を元に、1からn
各オリの中のライオンの数を求めることにした。

入力形式

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

n x m
l_1 r_1 s_1
...
l_m r_m s_m

1行目は3つの整数n x mで、
それぞれオリの数、一つのオリの中のライオンの最大の数、
数えるのに協力した人の数である。
2行目から続くm行は各行3つの整数で、
それぞれi番目の人が数えた結果
l_i r_is_iである。
l_i番からr_i番までのオリのライオンを数えたら
合計s_i頭いたことを表している。

出力形式

数えてもらった結果が全て正しいとして、
1からnの
各オリの中のライオンの数を空白区切りのn個の整数で出力せよ。
そのような答が複数あるときは、
ライオンの数の合計が最大になるものをどれでも良いので一つ出力せよ。
条件を満たすライオンの配置が一つもないときは-1を出力せよ。

制約

1 ≤ n ≤ 6

1 ≤ x ≤ 10

1 ≤ m ≤ 10

1 ≤ l_i ≤ r_i ≤ n

0 ≤ s_i ≤ 60

入力値はすべて整数である。

入出力例

入力例 1

3 5 1
1 2 5

出力例 1

2 3 5

その他"4 1 5"や"0 5 5"なども正しい出力である。

入力例 2

4 5 2
1 3 15
3 4 3

出力例 2

-1

条件を満たすライオンの配置が一つもないときは-1を出力せよ。

Solution in Scala (judge verdict: Wrong Answer)


import scala.annotation.tailrec

object Main extends App {

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

  val Array(n, x, m) = readLine.trim.split(' ').map(_.toInt)
  val gages = Array.tabulate(n + 1){_ ⇒ new Gage}
  for (_ ← 0 until m){
    val Array(l, r, s) = readLine.trim.split(' ').map(_.toInt)
    gages(l - 1).addRelation(r - 1, s)
    gages(r - 1).addRelation(l - 1, -s)
  }
  implicit val suspect = Array.tabulate(n){_ ⇒ None: Option[Position]}
  val searched = (for (i ← suspect.indices) yield {
    suspect(i) match {
      case None ⇒
        suspect(i) = Some(Absolute(0))
        val (smin, smax) = searchSub(gages, suspect, i)
        suspect(i) = Some(Absolute(x - smax))
        Option(smin, smax)
      case _ ⇒ None
    }
  }).flatten

  println(
    if (searched.exists{case (smin, smax) ⇒ smin + x < smax}) -1
    else {
      suspect.flatMap{_.map{_.getAbsolute}}.flatten.mkString(" ")
    }
  )

  def searchSub(gages: Array[Gage], suspects: Array[Option[Position]], current: Int): (Int, Int) = {
    val (orient, diff) = suspects(current) match {
      case Some(Absolute(_)) ⇒ (current, 0)
      case Some(Relation(o, d)) ⇒ (o, d)
      case None ⇒ ???
    }
    val sub = for (relation ← gages(current).relations) yield {
      suspects(relation.orient) match {
        case Some(r@Relation(_, _)) if orient == r.orient && diff + relation.diff == r.diff ⇒ None
        case Some(Absolute(o)) if o == orient ⇒ None
        case Some(_) ⇒ Some(Int.MinValue, Int.MaxValue)
        case None ⇒
          suspects(relation.orient) = Some(Relation(orient, diff + relation.diff))
          Some(searchSub(gages, suspects, relation.orient))
      }
    }
    sub.flatten.foldLeft(diff, diff) {
      case ((cmin, cmax), (smin, smax)) ⇒ (min(cmin, smin), max(cmax, smax))
    }
  }
  sealed trait Position {
    def getAbsolute(implicit s: Array[Option[Position]]): Option[Int] = {
      this match {
        case Absolute(count) ⇒ Option(count)
        case Relation(orient, diff) ⇒ s(orient).flatMap{_.getAbsolute(s).map{_ + diff}}
      }
    }
  }
  case class Relation(orient: Int, diff: Int) extends Position
  case class Absolute(count: Int) extends Position
  class Gage{
    private var mRelations: List[Relation] = Nil
    def addRelation(to: Int, diff: Int): Unit = {
      mRelations ::= Relation(to, diff)
    }
    def relations: List[Relation] = mRelations
  }
  implicit class Extenion[T](val value :T){
    def also(func: T ⇒ Unit): T = {
      func(value)
      value
    }
    def let[R](func: T ⇒ R): R = func(value)
  }
}