object Solution extends App { import io.StdIn._ for (_ <- 1 to readLine.trim.toInt) { val Array(m, n, _*) = readLine.trim.split(" +").map(_.toInt) val t = readLine.trim.split(" +").map(_(0)) val s = readLine.trim.split(" +").map(_.toInt) val d = readLine.trim.split(" +").map(_.toInt) println(minimumZooNumbers(m, n, t, s, d).mkString(" ")) } case class Animal(t: Int, s: Int, d: Int, cnt: Int) def minimumZooNumbers(m: Int, n: Int, t: Array[Char], s: Array[Int], d: Array[Int]): Array[Int] = { val dp = Array.fill(m+1, 2)(0) val animals = (t, s, d).zipped.map((t1, s1, d1) => Animal(if (t1 == 'E' || t1 == 'C') 0 else 1, s1, d1, 1)). filter(a => a.s < a.d). sortWith((a1, a2) => a1.d < a2.d || a1.d == a2.d && (a1.t < a2.t || a1.t == a2.t && a1.s > a2.s)). foldLeft(List[Animal]()){ case (Nil, a) => a::Nil case (lst@(Animal(t, s, d, cnt) :: tl), a) => if(t==a.t && s==a.s &&d==a.d) Animal(t, s, d, cnt+1) :: tl else a :: lst }.reverse.toArray // println(animals.mkString("\n")) var a = 0 for (d <- 1 to m) { dp(d)(0) = dp(d-1)(0) dp(d)(1) = dp(d-1)(1) if(a=0 && animals(a4).d>animals(a3).s) { if(animals(a4).t==t) { if(animals(a4).s>=animals(a3).s) sameTypeSubrange += animals(a4).cnt else maxOverlapEnd = maxOverlapEnd max dp(animals(a4).d)(t) } a4 -= 1 } dp(d)(t) = dp(d)(t) max (dp(animals(a3).s)(1-t) max maxOverlapEnd)+sameTypeSubrange+animals(a3).cnt } a = a2 } } } // dp.foreach(row => println(row.mkString(" "))) val ret = Array.fill(n)(-1) var dest = 1 for (ans <- ret.indices) { while (dest < dp.length && (dp(dest)(0) max dp(dest)(1)) < ans+1) dest += 1 if(dest < dp.length) ret(ans) = dest } ret } }