https://coderun.yandex.ru/problem/meetings/description Средняя

Решение

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

// Хранение встреч: день -> имя -> список встреч (временной слот, продолжительность, участники)
private val schedule = mutableMapOf<Int, MutableMap<String, MutableList<Triple<Int, Int, List<String>>>>>()

// Преобразование времени "HH:MM" в минуты с начала дня
private fun timeToMinutes(time: String): Int {
    val (hh, mm) = time.split(":").map { it.toInt() }
    return hh * 60 + mm
}

// Проверка пересечения встреч
private fun isOverlapping(start1: Int, duration1: Int, start2: Int, duration2: Int): Boolean {
    return !(start1 + duration1 <= start2 || start2 + duration2 <= start1)
}

// Добавление встречи
private fun addAppointment(day: Int, time: String, duration: Int, names: List<String>, writer: BufferedWriter) {
    val startTime = timeToMinutes(time)
    val conflicts = mutableSetOf<String>()

    for (name in names) {
        val meetings = schedule.getOrPut(day) { mutableMapOf() }.getOrPut(name) { mutableListOf() }
        if (meetings.any { isOverlapping(it.first, it.second, startTime, duration) }) {
            conflicts.add(name)
        }
    }

    if (conflicts.isEmpty()) {
        for (name in names) {
            schedule[day]!![name]!!.add(Triple(startTime, duration, names))
        }
        writer.write("OK\\n")
    } else {
        writer.write("FAIL\\n")
        writer.write(conflicts.joinToString(" ") + "\\n")
    }
}

// Вывод встреч для конкретного дня и участника
private fun printSchedule(day: Int, name: String, writer: BufferedWriter) {
    schedule[day]?.get(name)?.sortedBy { it.first }?.forEach { (start, duration, names) ->
        val hh = start / 60
        val mm = start % 60
        writer.write("%02d:%02d %d %s\\n".format(hh, mm, duration, names.joinToString(" ")))
    }
}

fun main() {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))

    val n = reader.readLine().toInt() // Количество запросов

    repeat(n) {
        val parts = reader.readLine().split(" ")
        when (parts[0]) {
            "APPOINT" -> {
                val day = parts[1].toInt()
                val time = parts[2]
                val duration = parts[3].toInt()
                val names = parts.drop(5)
                addAppointment(day, time, duration, names, writer)
            }
            "PRINT" -> {
                val day = parts[1].toInt()
                val name = parts[2]
                printSchedule(day, name, writer)
            }
        }
    }

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