https://coderun.yandex.ru/problem/mega-pizza Сложная

Решение

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import kotlin.math.abs

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

    val (n, m, k) = reader.readLine().split(' ').map { it.toInt() }
    val wishes = Array(n) { ArrayList<Int>() }
    repeat(k) {
        val parts = reader.readLine().split(' ')
        val a = parts[0].toInt() - 1
        val b = parts[1].toInt()
        val v = abs(b) - 1
        val lit = if (b > 0) 2 * v else 2 * v + 1
        wishes[a].add(lit)
    }
    var totalAux = 0
    for (i in 0 until n) {
        val sz = wishes[i].size
        if (sz >= 2) totalAux += sz - 1
    }
    val totalVars = m + totalAux
    val N = totalVars * 2
    val graph = Array<MutableList<Int>>(N) { ArrayList() }
    val revGraph = Array<MutableList<Int>>(N) { ArrayList() }

    fun addImp(u: Int, v: Int) {
        graph[u].add(v)
        revGraph[v].add(u)
    }
    fun clause(litA: Int, litB: Int) {
        val notA = litA xor 1
        val notB = litB xor 1
        addImp(notA, litB)
        addImp(notB, litA)
    }

    var nextAux = m
    for (i in 0 until n) {
        val lst = wishes[i]
        val r = lst.size
        if (r >= 2) {
            val aux = IntArray(r - 1) { j -> nextAux + j }
            nextAux += r - 1
            for (j in 0 until r - 1) {
                val litj = lst[j]
                val sj = aux[j]
                clause(litj, 2 * sj)
                clause(lst[j + 1], 2 * sj + 1)
            }
            for (j in 1 until r - 1) {
                val sprev = aux[j - 1]
                val sj = aux[j]
                clause(2 * sprev + 1, 2 * sj)
            }
        }
    }

    val visited = BooleanArray(N)
    val order = IntArray(N)
    var op = 0
    fun dfs1(u: Int) {
        visited[u] = true
        for (v in graph[u]) if (!visited[v]) dfs1(v)
        order[op++] = u
    }
    for (u in 0 until N) if (!visited[u]) dfs1(u)

    val comp = IntArray(N) { -1 }
    var cid = 0
    fun dfs2(u: Int) {
        comp[u] = cid
        for (v in revGraph[u]) if (comp[v] == -1) dfs2(v)
    }
    for (idx in N - 1 downTo 0) {
        val u = order[idx]
        if (comp[u] == -1) {
            dfs2(u)
            cid++
        }
    }

    val assign = BooleanArray(totalVars)
    for (v in 0 until totalVars) {
        if (comp[2 * v] == comp[2 * v + 1]) {
            writer.write("-1")
            writer.newLine()
            writer.flush()
            return
        }
        assign[v] = comp[2 * v] > comp[2 * v + 1]
    }

    val result = ArrayList<Int>()
    for (i in 0 until m) if (assign[i]) result.add(i + 1)
    writer.write(result.size.toString())
    writer.newLine()
    if (result.isNotEmpty()) {
        writer.write(result.joinToString(" "))
        writer.newLine()
    }
    writer.flush()
}