提出 #64783417


ソースコード 拡げる

@OptIn(ExperimentalStdlibApi::class)
fun main() {
    val n = Sc.int()
    val m = Sc.int()

    val graph = List(n) { mutableListOf<Int>() }
    repeat(m) {
        val u = Sc.int() - 1
        val v = Sc.int() - 1
        graph[u].add(v)
        graph[v].add(u)
    }

    // 1, 2, ..., k が接続する全ての辺からなる UF
    val allUf = UnionFind(n)
    // 1, 2, ..., k 内の辺からなる UF
    val minUf = UnionFind(n)

    val ans = (0..<n).map { k ->
        for (v in graph[k]) {
            allUf.merge(k, v)
            if (v < k) minUf.merge(k, v)
        }

        if (minUf.size(0) != k + 1) {
            -1
        } else {
            allUf.size(0) - k - 1
        }
    }

    println(ans.joinToString("\n"))
}

// ==================== Libraries ====================
object Sc {
    private val buffer: ArrayDeque<String> = ArrayDeque()

    fun string(): String {
        while (buffer.isEmpty()) buffer.addAll(readln().split(" "))
        return buffer.removeFirst()
    }

    fun int(): Int = string().toInt()

    fun long(): Long = string().toLong()
}

class UnionFind(
    private val _size: Int,
) {
    /**
     * 非負 -> 親の要素
     * 負 -> その要素が代表元である集合のサイズ (符号反転)
     */
    private val parentOrSizes = IntArray(_size) { -1 }

    /** v が属する集合の代表元を返す */
    fun leader(v: Int): Int =
        if (parentOrSizes[v] < 0) {
            v
        } else {
            parentOrSizes[v] = leader(parentOrSizes[v])
            parentOrSizes[v]
        }

    /** u が属する集合と v が属する集合を合併し、新たな集合の代表元を返す */
    fun merge(
        u: Int,
        v: Int,
    ): Int {
        var u = leader(u)
        var v = leader(v)

        if (u != v) {
            if (-parentOrSizes[u] < -parentOrSizes[v]) u = v.also { v = u } // swap
            parentOrSizes[u] += parentOrSizes[v]
            parentOrSizes[v] = u
        }
        return u
    }

    /** u と v が同じ集合に属するかを返す */
    fun same(
        u: Int,
        v: Int,
    ): Boolean = leader(u) == leader(v)

    /** v が属する集合の大きさを返す */
    fun size(v: Int): Int = -parentOrSizes[leader(v)]

    /** 各集合を返す */
    @OptIn(ExperimentalStdlibApi::class)
    fun groups(): List<List<Int>> {
        val groups = List(_size) { mutableListOf<Int>() }
        for (v in 0..<_size) groups[leader(v)].add(v)
        return groups.mapNotNull { group -> if (group.isEmpty()) null else group.toList() }
    }
}

提出情報

提出日時
問題 E - Reachable Set
ユーザ Tiramister
言語 Kotlin (Kotlin/JVM 1.8.20)
得点 450
コード長 2584 Byte
結果 AC
実行時間 865 ms
メモリ 95120 KiB

コンパイルエラー

Main.kt:73:13: warning: name shadowed: u
        var u = leader(u)
            ^
Main.kt:74:13: warning: name shadowed: v
        var v = leader(v)
            ^

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 450 / 450
結果
AC × 4
AC × 49
セット名 テストケース
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt, 01_random_04.txt, 01_random_05.txt, 01_random_06.txt, 01_random_07.txt, 01_random_08.txt, 01_random_09.txt, 01_random_10.txt, 01_random_11.txt, 01_random_12.txt, 01_random_13.txt, 01_random_14.txt, 01_random_15.txt, 01_random_16.txt, 01_random_17.txt, 01_random_18.txt, 01_random_19.txt, 01_random_20.txt, 01_random_21.txt, 01_random_22.txt, 01_random_23.txt, 01_random_24.txt, 01_random_25.txt, 01_random_26.txt, 01_random_27.txt, 01_random_28.txt, 01_random_29.txt, 01_random_30.txt, 01_random_31.txt, 01_random_32.txt, 01_random_33.txt, 01_random_34.txt, 01_random_35.txt, 01_random_36.txt, 01_random_37.txt, 01_random_38.txt, 01_random_39.txt, 01_random_40.txt, 01_random_41.txt, 01_random_42.txt, 01_random_43.txt, 01_random_44.txt, 01_random_45.txt, 01_random_46.txt, 01_random_47.txt, 01_random_48.txt
ケース名 結果 実行時間 メモリ
00_sample_00.txt AC 87 ms 43776 KiB
00_sample_01.txt AC 89 ms 43472 KiB
00_sample_02.txt AC 89 ms 43536 KiB
00_sample_03.txt AC 90 ms 43432 KiB
01_random_04.txt AC 652 ms 89960 KiB
01_random_05.txt AC 654 ms 91780 KiB
01_random_06.txt AC 662 ms 92672 KiB
01_random_07.txt AC 699 ms 91648 KiB
01_random_08.txt AC 862 ms 92196 KiB
01_random_09.txt AC 815 ms 92440 KiB
01_random_10.txt AC 813 ms 91736 KiB
01_random_11.txt AC 815 ms 94844 KiB
01_random_12.txt AC 849 ms 91444 KiB
01_random_13.txt AC 812 ms 91252 KiB
01_random_14.txt AC 835 ms 91476 KiB
01_random_15.txt AC 587 ms 74600 KiB
01_random_16.txt AC 344 ms 66844 KiB
01_random_17.txt AC 194 ms 65176 KiB
01_random_18.txt AC 136 ms 48408 KiB
01_random_19.txt AC 140 ms 48920 KiB
01_random_20.txt AC 434 ms 69400 KiB
01_random_21.txt AC 384 ms 67168 KiB
01_random_22.txt AC 237 ms 57568 KiB
01_random_23.txt AC 479 ms 70284 KiB
01_random_24.txt AC 473 ms 71052 KiB
01_random_25.txt AC 418 ms 67004 KiB
01_random_26.txt AC 818 ms 92820 KiB
01_random_27.txt AC 845 ms 94424 KiB
01_random_28.txt AC 812 ms 93344 KiB
01_random_29.txt AC 853 ms 92140 KiB
01_random_30.txt AC 865 ms 94668 KiB
01_random_31.txt AC 861 ms 94772 KiB
01_random_32.txt AC 766 ms 92808 KiB
01_random_33.txt AC 848 ms 92032 KiB
01_random_34.txt AC 762 ms 92576 KiB
01_random_35.txt AC 789 ms 91964 KiB
01_random_36.txt AC 812 ms 95120 KiB
01_random_37.txt AC 815 ms 91776 KiB
01_random_38.txt AC 92 ms 43468 KiB
01_random_39.txt AC 89 ms 43388 KiB
01_random_40.txt AC 90 ms 43548 KiB
01_random_41.txt AC 91 ms 43768 KiB
01_random_42.txt AC 88 ms 43452 KiB
01_random_43.txt AC 90 ms 43608 KiB
01_random_44.txt AC 88 ms 43540 KiB
01_random_45.txt AC 91 ms 43756 KiB
01_random_46.txt AC 90 ms 43520 KiB
01_random_47.txt AC 89 ms 43484 KiB
01_random_48.txt AC 87 ms 43648 KiB