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

Решение

import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.BufferedWriter
import java.io.OutputStreamWriter

data class Tower(val x: Int, val y: Int)

fun dist(t1: Tower, t2: Tower): Double {
    val dx = t1.x - t2.x
    val dy = t1.y - t2.y
    return Math.sqrt((dx * dx + dy * dy).toDouble())
}

fun dfs(graph: List<List<Int>>, colors: IntArray, v: Int, color: Int): Boolean {
    colors[v] = color
    for (u in graph[v]) {
        if (colors[u] == 0) {
            if (!dfs(graph, colors, u, 3 - color)) return false
        } else if (colors[u] == color) {
            return false
        }
    }
    return true
}

fun canColor(towers: List<Tower>, power: Double, colors: IntArray): Boolean {
    val n = towers.size
    val graph = List(n) { mutableListOf<Int>() }
    
    for (i in 0 until n) {
        for (j in i + 1 until n) {
            if (dist(towers[i], towers[j]) < 2 * power) {
                graph[i].add(j)
                graph[j].add(i)
            }
        }
    }
    
    colors.fill(0)
    for (i in 0 until n) {
        if (colors[i] == 0) {
            if (!dfs(graph, colors, i, 1)) return false
        }
    }
    return true
}

fun findMaxPower(n: Int, towers: List<Tower>): Pair<Double, IntArray> {
    var left = 0.0
    var right = 20000.0
    val colors = IntArray(n)
    lateinit var bestColors: IntArray
    
    repeat(50) {
        val mid = (left + right) / 2
        if (canColor(towers, mid, colors)) {
            left = mid
            bestColors = colors.copyOf()
        } else {
            right = mid
        }
    }
    
    return Pair(left, bestColors)
}

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

    val n = reader.readLine().toInt()
    
    val towers = mutableListOf<Tower>()
    repeat(n) {
        val (x, y) = reader.readLine().split(" ").map { it.toInt() }
        towers.add(Tower(x, y))
    }

    val (power, colors) = findMaxPower(n, towers)
    
    writer.write(String.format("%.15f\\n", power))
    writer.write(colors.joinToString(" "))
    writer.flush()

    reader.close()
    writer.close()
}