https://coderun.yandex.ru/problem/run-manhattan/description Средняя

Решение

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import kotlin.math.max
import kotlin.math.min
import kotlin.math.ceil
import kotlin.math.floor

fun main(args: Array<String>) {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))

    val firstLine = reader.readLine().split(" ").map { it.toInt() }
    val t = firstLine[0]
    val d = firstLine[1]
    val n = firstLine[2]

    val maxDistFromOrigin = t * n

    var uMin: Long = -maxDistFromOrigin.toLong()
    var uMax: Long = maxDistFromOrigin.toLong()
    var vMin: Long = -maxDistFromOrigin.toLong()
    var vMax: Long = maxDistFromOrigin.toLong()

    for (i in 1..n) {
        val reading = reader.readLine().split(" ").map { it.toInt() }
        val xi = reading[0].toLong()
        val yi = reading[1].toLong()

        val timeToEnd = t * (n - i)
        val maxDistFromReadingI = (timeToEnd + d).toLong()

        val ui = xi + yi
        val vi = xi - yi

        uMin = max(uMin, ui - maxDistFromReadingI)
        uMax = min(uMax, ui + maxDistFromReadingI)
        vMin = max(vMin, vi - maxDistFromReadingI)
        vMax = min(vMax, vi + maxDistFromReadingI)
    }

    val possiblePoints = ArrayList<Pair<Int, Int>>()

    val xStart = ceil((uMin + vMin).toDouble() / 2.0).toInt()
    val xEnd = floor((uMax + vMax).toDouble() / 2.0).toInt()

    for (x in xStart..xEnd) {
        val yStart = ceil(max(uMin.toDouble() - x, x.toDouble() - vMax)).toInt()
        val yEnd = floor(min(uMax.toDouble() - x, x.toDouble() - vMin)).toInt()

        for (y in yStart..yEnd) {
            possiblePoints.add(Pair(x, y))
        }
    }

    writer.write("${possiblePoints.size}")
    writer.newLine()
    for (point in possiblePoints) {
        writer.write("${point.first} ${point.second}")
        writer.newLine()
    }

    writer.flush()
    writer.close()
    reader.close()
}