AtCoder ABC213
hr.icon
C. reorder cards
code:kotlin
fun reorderCards() {
val (h, w, n) = readLine()!!.trim().split(' ').map(String::toInt)
val cards = List(n) {
val (a, b) = readLine()!!.trim().split(' ').map(String::toInt)
a to b
}
val rows = cards.map { it.first }.toSet().sorted()
val rowDest = rows.indices.associateBy { rowsit } val columns = cards.map(Pair<*, Int>::second).distinct().sorted()
val columnDest = columns.indices.associateBy(columns::get)
for ((a, b) in cards) {
println("${rowDesta!! + 1} ${columnDestb!! + 1}") }
}
reviews:
val cards = List(n) {...}
{...}内の処理が返却されるn個の配列をつくることができる
ダブルコロン演算子
パラメータとして関数を取り、別の関数に渡す
rows.indices.associateBy { rows[it] }とrows.indices.associateBy(rows::get)は同じ結果になる
List.indices
IntRangeを返却する。n個の配列であれば0..n
associatedBy {...}
各要素に対してラムダ式が実行されて、各要素がkey、ラムダ式の実行結果がvalueとなるMapが作成される
hr.icon
D. takahashi tour
code:kotlin
fun takahashiTour() {
val n = readLine()!!.trim().toInt()
val graph = List(n) { mutableListOf<Int>() }
repeat(n - 1) {
val (a, b) = readLine()!!.trim().split(' ').map(String::toInt)
//各都市の接続先都市を格納
}
for (edge in graph) {
//数字が大きく訪問優先順位が低い都市が先頭に来るようソート
edge.sortDescending()
}
val history = mutableListOf<Int>()
val stack = ArrayDeque<Int>(listOf(0))
val visit = BooleanArray(n)
while (stack.isNotEmpty()) {
val top = stack.removeLast()
history.add(top + 1)
stack.addLast(top)
stack.addLast(next)
}
}
println(history.joinToString(" "))
}
reviews:
ArrayDeque
始端と終端の概念がある配列
例えば、removeLast()を実行すると、最後の要素が削除されて、削除された要素が返却される
BooleanArray
ブール値の配列