[白俊]2170号:スクライブ
質問リンク にxを昇順にソートするように入力します. 開始情報(0番目のインデックス)を格納し、1から(n−1)まで巡回する. で切断された線が長いかどうかを確認し、長さを蓄積し、長さ情報を変更します. のオフラインに遭遇した時だけ長さを積むので、ツアー終了後は長さを積まなければならないことを忘れないでください.
O(n)
var answer = 0
fun main() {
val br = System.`in`.bufferedReader()
val bw = System.out.bufferedWriter()
val n = br.readLine().toInt()
val lines = mutableListOf<Pair<Int, Int>>()
for (i in 0 until n) {
val (x, y) = br.readLine().split(" ").map { it.toInt() }
lines.add(Pair(x, y))
}
lines.sortBy { it.first }
val answer = lineSweepingStartWithOne(lines)
bw.write("$answer")
br.close()
bw.close()
}
fun lineSweepingStartWithOne(lines: MutableList<Pair<Int, Int>>): Int {
var start = lines[0].first
var end = lines[0].second
lines.drop(1).forEach { (x, y) ->
if (isSeparateLine(x, end)) {
accumulateLength(end - start)
// new start position
start = x
end = y
} else if (isLongerLine(y, end)) end = y
}
accumulateLength(end - start)
return answer
}
fun isSeparateLine(x: Int, end: Int): Boolean {
return x > end
}
fun accumulateLength(length: Int) {
answer += length
}
fun isLongerLine(y: Int, end: Int): Boolean {
return y > end
}
時間の複雑さ
O(n)
Reference
この問題について([白俊]2170号:スクライブ), 我々は、より多くの情報をここで見つけました https://velog.io/@kldaji/백준-2170번-선-긋기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol