[白俊]2170号:スクライブ


質問リンク
  • にxを昇順にソートするように入力します.
  • 開始情報(0番目のインデックス)を格納し、1から(n−1)まで巡回する.
  • で切断された線が長いかどうかを確認し、長さを蓄積し、長さ情報を変更します.
  • のオフラインに遭遇した時だけ長さを積むので、ツアー終了後は長さを積まなければならないことを忘れないでください.
  • 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)