https://coderun.yandex.ru/problem/neighbor-parity Легкая

Решение

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

fun isEven(n: Int): Boolean {
    return n % 2 == 0
}

fun calculateSwaps(n: Int, initialA: List<Int>, startParity: Int): Pair<Int, List<Int>> {
    val currentA = initialA.toMutableList()
    val mismatchedOddIndices = ArrayDeque<Int>()
    val mismatchedEvenIndices = ArrayDeque<Int>()
    var swaps = 0

    for (i in 0 until n) {
        val requiredParity = (startParity + i) % 2
        val currentElement = currentA[i]
        val currentParity = if (isEven(currentElement)) 0 else 1

        if (currentParity != requiredParity) {
            if (currentParity == 0) {
                if (mismatchedOddIndices.isNotEmpty()) {
                    val oddIdx = mismatchedOddIndices.pop()
                    val temp = currentA[i]
                    currentA[i] = currentA[oddIdx]
                    currentA[oddIdx] = temp
                    swaps++
                } else {
                    mismatchedEvenIndices.push(i)
                }
            } else {
                if (mismatchedEvenIndices.isNotEmpty()) {
                    val evenIdx = mismatchedEvenIndices.pop()
                    val temp = currentA[i]
                    currentA[i] = currentA[evenIdx]
                    currentA[evenIdx] = temp
                    swaps++
                } else {
                    mismatchedOddIndices.push(i)
                }
            }
        }
    }

    val k = swaps * 2
    return Pair(k, currentA)
}

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

    val n = reader.readLine().toInt()
    val a = reader.readLine().split(" ").map { it.toInt() }

    var evenCount = 0
    var oddCount = 0
    for (x in a) {
        if (isEven(x)) {
            evenCount++
        } else {
            oddCount++
        }
    }

    if (kotlin.math.abs(evenCount - oddCount) > 1) {
        writer.write("-1")
        writer.newLine()
    } else {
        var resultK: Int
        var resultB: List<Int>

        if (evenCount > oddCount) {
            val (k, b) = calculateSwaps(n, a, 0)
            resultK = k
            resultB = b
        } else if (oddCount > evenCount) {
            val (k, b) = calculateSwaps(n, a, 1)
            resultK = k
            resultB = b
        } else {
            val (k0, b0) = calculateSwaps(n, a, 0)
            val (k1, b1) = calculateSwaps(n, a, 1)

            if (k0 <= k1) {
                resultK = k0
                resultB = b0
            } else {
                resultK = k1
                resultB = b1
            }
        }

        writer.write(resultK.toString())
        writer.newLine()
        writer.write(resultB.joinToString(" "))
        writer.newLine()
    }

    reader.close()
    writer.close()
}