JNC Official

Just Normal Coders Official Archive

Sample Solutions

Kotlin Heroes: Episode 1

[+] Open

A: Three Integers Again

fun main() {
    val q = readLine()!!.toInt()
    repeat(q) {
        val parts = readLine()!!.split(" ")
        val x = parts[0].toLong(); val y = parts[1].toLong()
        val b = minOf(x, y) - 1
        val a = x - b; val c = y - b
        println("$a $b $c")
    }
}

B: Bad Days

fun main() {
    val n = readLine()!!.toInt()
    val arr = readLine()!!.split(" ").map { it.toInt() }
    var max1 = -1; var max2 = -1; var badDays = 0
    for (a in arr) {
        if (a < max2) badDays++
        if (a > max1) { max2 = max1; max1 = a } 
        else if (a > max2) max2 = a
    }
    println(badDays)
}

C: Minus and Minus Give Plus

fun solve() {
    val s = readLine() ?: return; val t = readLine() ?: return
    var i = 0; var j = 0 
    while (j < t.length) {
        if (i >= s.length) { println("NO"); return }
        if (s[i] == t[j]) { i++; j++ } 
        else if (t[j] == '+' && s[i] == '-') {
            if (i + 1 < s.length && s[i+1] == '-') { i += 2; j++ } 
            else { println("NO"); return }
        } else { println("NO"); return }
    }
    if (i == s.length) println("YES") else println("NO")
}

D: Decoding of Integer Sequences

import java.util.ArrayDeque
fun main() {
    val m = readLine()!!.toInt()
    val b = readLine()!!.split(" ").map { it.toInt() }
    val n = b.count { it == -1 }
    val res = Array(n) { mutableListOf<Int>() }
    val q = ArrayDeque<Int>()
    for (i in 0 until n) q.add(i)
    for (x in b) {
        val i = q.removeFirst()
        if (x == -1) continue
        res[i].add(x)
        q.addLast(i)
    }
    println(n)
    for (i in 0 until n) {
        print(res[i].size)
        for (v in res[i]) print(" $v")
        println()
    }
}

E: Sliding Doors

import java.util.*
fun main() {
    val sc = Scanner(System.`in`); val n = sc.nextInt(); val m = sc.nextInt()
    val a = LongArray(n); val pref = LongArray(n + 1)
    for (i in 0 until n) { a[i] = sc.nextLong(); pref[i+1] = pref[i] + a[i] }
    val q = sc.nextInt()
    repeat(q) {
        val c = sc.nextInt(); val w = IntArray(c)
        for (i in 0 until c) w[i] = sc.nextInt()
        val gaps = mutableListOf<Int>(); gaps.add(w[0] - 1)
        for (i in 0 until c - 1) gaps.add(w[i+1] - w[i] - 1)
        gaps.add(m - w[c-1])
        var cur = 0; for (gap in gaps) {
            if (cur == n) break
            val maxW = pref[cur] + gap
            var l = cur; var r = n; var best = cur
            while (l <= r) {
                val mid = (l + r) / 2
                if (pref[mid] <= maxW) { best = mid; l = mid + 1 } else r = mid - 1
            }
            cur = best
        }
        if (cur == n) println("YES") else println("NO")
    }
}

Kotlin Heroes: Episode 2

[+] Open

Copyright © MikeMirzayanov

A: Three Problems

fun main() {
    val n = readLine()!!.toInt()
    val r = readLine()!!.split(" ").map { it.toInt() }
        .withIndex().distinctBy { it.value }.sortedBy { it.value }.map { it.index + 1 }
    if (r.size < 3) println("-1 -1 -1") else println("${r[0]} ${r[1]} ${r[2]}")
}

B: Traveling Around the Golden Ring of Berland

Copyright © MikeMirzayanov
fun main() {
    val n = readLine()!!.toLong()
    val a = readLine()!!.split(" ").map { it.toInt() }
    var ans = 0L
    for ((i, k) in a.withIndex()) {
        if (k == 0) continue
        var visits = (i + 1).toLong()
        if (k > 0) visits += (k - 1) * n
        if (visits > ans) ans = visits
    }
    println(ans)
}

C: Мороженое

Copyright © geranazavr555, MikeMirzayanov
import kotlin.math.*
fun main() {
    val (n, k) = readLine()!!.split(" ").map { it.toInt() }
    val a = IntArray(n); val b = IntArray(n); val c = IntArray(n)
    for (i in 0 until n) {
        val l = readLine()!!.split(" ").map { it.toInt() }
        a[i] = l[0]; b[i] = l[1]; c[i] = l[2]
    }
    println(solveIceCream(a, b, c, n, k))
}
private fun solveIceCream(a: IntArray, b: IntArray, c: IntArray, n: Int, k: Int): Long {
    val sa = a.fold(0L, Long::plus); val sb = b.fold(0L, Long::plus)
    if (sa > k || sb < k) return -1
    var res = a.foldIndexed(0L) { i, acc, av -> acc + av.toLong() * c[i] }
    val e = c.mapIndexed { i, cv -> Extra(cv, b[i] - a[i]) }.sortedBy { it.c }
    var rem = k - sa; var idx = 0
    while (rem > 0) {
        val take = min(rem, e[idx].q.toLong()); rem -= take; res += e[idx].c * take; idx++
    }
    return res
}
data class Extra(val c: Int, val q: Int)

D: Teams

Copyright © MikeMirzayanov
import kotlin.math.*
fun main() {
    val (n, a, b, k) = readLine()!!.split(" ").map { it.toInt() }
    val rm = readLine()!!.split(" ").map { it.toInt() }.groupingBy { it }.eachCount().mapValues { Left(it.value) }
    val rl = rm.keys.sorted().let { if (a >= b) it else it.reversed() }
    var ans = 0
    for (r in rl) {
        val p = rm.getValue(r); if (p.cnt < a) continue
        val q = rm[r * k] ?: continue; if (q.cnt < b) continue
        val t = min(p.cnt / a, q.cnt / b)
        ans += t; p.cnt -= a * t; q.cnt -= b * t
    }
    println(ans)
}
data class Left(var cnt: Int)

E: Double Permutation Inc.

Copyright © geranazavr555, MikeMirzayanov
import kotlin.math.*
fun main() {
    val (n, a, b, k) = readLine()!!.split(" ").map { it.toInt() }
    val rm = readLine()!!.split(" ").map { it.toInt() }.groupingBy { it }.eachCount().mapValues { Left(it.value) }
    val rl = rm.keys.sorted().let { if (a >= b) it else it.reversed() }
    var ans = 0
    for (r in rl) {
        val p = rm.getValue(r); if (p.cnt < a) continue
        val q = rm[r * k] ?: continue; if (q.cnt < b) continue
        val t = min(p.cnt / a, q.cnt / b)
        ans += t; p.cnt -= a * t; q.cnt -= b * t
    }
    println(ans)
}
data class Left(var cnt: Int)

F: kotlinkotlinkotlinkotlin...

Copyright © MikeMirzayanov
fun main() {
    val n = readLine()!!.toInt(); val w = List(n) { readLine()!! }
    val k = "kotlin"; val g = k.withIndex().associateBy({ it.value }) { it.index }
    val gf = IntArray(k.length) { -1 }; val gn = IntArray(n); val gv = IntArray(n)
    for ((i, s) in w.withIndex()) {
        val p = g.getValue(s.first()); val q = (g.getValue(s.last()) + 1) % k.length
        gv[i] = q; gn[i] = gf[p]; gf[p] = i
    }
    val ans = IntArray(n); var cnt = 0; val vStack = IntArray(n + 1); val eStack = IntArray(n + 1); var sp = 0
    while (true) {
        val p = vStack[sp]
        if (gf[p] < 0) { if (sp <= 0) break; ans[cnt++] = eStack[sp--]; continue }
        val j = gf[p]; val q = gv[j]; gf[p] = gn[j]; sp++; vStack[sp] = q; eStack[sp] = j
    }
    ans.reverse(); println(ans.joinToString(" ") { (it + 1).toString() })
}