Problem:
B: 写像

問題

AORイカちゃんは集合 $S = \{a_1, ..., a_N\}$ と写像 $f: S→S$を作った。$f(a_i) = b_i$ である。
集合 $S$ の任意の要素 $x$ について、$g(f(x)) = h(f(x))$ を満たす全ての写像 $g, h: S→S$ が、$g(x) = h(x)$ を満たすかどうか判定し、満たさない場合は反例を一つ構成せよ。

制約

$1 \le N \le 10^5$

$1 \le a_i,b_i \le N$

$a_i \neq a_j \ (i \neq j)$

入力は全て整数

入力:

$N$

$a_1 \cdots a_N$

$b_1 \cdots b_N$

出力:

条件を満たす場合は

Yes

条件を満たさない場合は、反例を $g(a_i) = c_i, h(a_i) = d_i$ として

No

$c_1 \cdots c_N$

$d_1 \cdots d_N$

を出力せよ。また末尾に改行を出力せよ。

サンプル

サンプル入力 1

5
1 2 3 4 5
3 4 2 5 1

サンプル出力 1

Yes

サンプル入力 2

5
1 2 3 4 5
3 4 3 5 1

サンプル出力 2

No
3 1 5 2 4
3 2 5 2 4

Solution in Scala (judge verdict: Accepted)

object Main extends App {

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

  val n = readLine.trim.toInt
  val from = readLine.trim.split(' ').map(_.toInt)
  val to = readLine.trim.split(' ').map(_.toInt)
  val fromSet = new Set(from)
  val toSet = new Set(to)
  val (fromA, fromB) = from.sorted.let{a ⇒ (a.head, a(a.length - 1))}
  if (fromSet.size == 1 || from.forall(f ⇒ toSet.contains(f))) {
    println("Yes")
  }else {
    println("No")
    println(
      from.indices.map(_ ⇒ fromA).mkString(" ")
    )
    println(
      from.indices.map{
        case i if toSet.contains(from(i)) ⇒ fromA
        case _ ⇒ fromB
      }.mkString(" ")
    )
  }

  class Set[T](factors: Array[T])(implicit ordering: Ordering[T]) {
    private val mList: Array[T] = factors.distinct.sorted
    def contains(value:T): Boolean = {
      lowerBound(mList, value) match {
        case Some(i) ⇒ mList(i) == value
        case None ⇒ false
      }
    }
    def size: Int = mList.size


  }
  def lowerBound[T](array: Array[T], target: T)(implicit ordering: Ordering[T]): Option[Int] = {
    var left = 0
    var right = array.length
    while (left < right){
      val mid = (left + right) / 2
      if (ordering.compare(array(mid), target) < 0){
        left = mid + 1
      }else {
        right = mid
      }
    }
    if (right == array.length) None
    else Some(right)
  }


  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)
  }
}