Submission #58993936


Source Code Expand

import std;

void main () {
    int N;
    long K;
    readln.read(N, K);

    auto X = readln.split.to!(int[]);
    auto A = readln.split.to!(int[]);
    X[] -= 1;

    auto fg = new FunctionalGraph(N);
    foreach (i; 0..N) {
        fg.add_edge(i, X[i]);
    }
    fg.build();

    auto B = new int[](N);
    foreach (i; 0..N) {
        int j = fg.move_k(i, K);
        B[i] = A[j];
    }

    foreach (i; 0..N) {
        write(B[i], i == N - 1 ? '\n' : ' ');
    }
}

void read (T...) (string S, ref T args) {
    import std.conv : to;
    import std.array : split;
    auto buf = S.split;
    foreach (i, ref arg; args) {
        arg = buf[i].to!(typeof(arg));
    }
}

class FunctionalGraph {
    int N;
    int[] next;
    int[] roop;
    int[] roop_start;
    int[] roop_size;
    int[] place;

    int[][] doubling;
    int max_table_size = 0;

    bool built = false;

    this (int N) {
        this.N = N;
        roop = new int[](N);
        roop_start = new int[](N);
        roop_start[] = -1;

        roop_size = new int[](N);
        roop_size[] = -1;

        place = new int[](N);
        place[] = -1;

        next = new int[](N);
        next[] = -1;

        import core.bitop : bsr;
        max_table_size = bsr(N) + 1;
        doubling = new int[][](max_table_size, N);
    }

    void add_edge (int from, int to)
    in {
        assert(next[from] == -1);
        assert(0 <= from && from < N);
        assert(0 <= to && to < N);
    }
    do {
        next[from] = to;
    }

    void build ()
    in {
        foreach (i; 0..N) assert(next[i] != -1);
    }
    do {
        // ループを検出: O(N)時間
        auto vis = new bool[](N);
        auto work = new int[](N);
        int latest = 0;

        foreach (i; 0..N) {
            if (vis[i]) continue;
            work.length = 0;

            int cur = i;
            while (!vis[cur]) {
                vis[cur] = true;
                work ~= cur;
                cur = next[cur];
            }

            int start = -1;
            foreach (w; 0..work.length) {
                if (work[w] == cur) {
                    start = w.to!int;
                    break;
                }
            }
            if (start == -1) continue;

            int rs = latest;
            int wl = work.length.to!int;
            foreach (w; work[start..$]) {
                roop[latest] = w;
                roop_start[w] = rs;
                roop_size[w] = wl - start;
                place[w] = latest - rs;
                latest++;
            }
        }

        // ダブリング構築: O(NlogN)時間
        foreach (i; 0..N) {
            doubling[0][i] = next[i];
        }
        foreach (i; 0..max_table_size - 1) {
            foreach (j; 0..N) {
                auto v = doubling[i][j];
                doubling[i + 1][j] = doubling[i][v];
            }
        }

        built = true;
    }

    int move_k (int fr, long K)
    in {
        assert(0 <= K);
        assert(built);
    }
    do {
        // ダブリングしながらループに入った時点でreturn
        foreach_reverse (i; 0..max_table_size) {
            if (roop_start[fr] != -1) {
                break;
            }

            if ((1 << i) <= K) {
                fr = doubling[i][fr];
                K -= (1 << i);
            }
        }
        if (K == 0) {
            return fr;
        }

        int suc = (K + place[fr]) % roop_size[fr];
        return roop[roop_start[fr] + suc];
    }
}

Submission Info

Submission Time
Task E - Permute K times
User InTheBloom
Language D (LDC 1.32.2)
Score 450
Code Size 3649 Byte
Status AC
Exec Time 70 ms
Memory 28440 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 450 / 450
Status
AC × 3
AC × 83
Set Name Test Cases
Sample sample_01.txt, sample_02.txt, sample_03.txt
All sample_01.txt, sample_02.txt, sample_03.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt, test_23.txt, test_24.txt, test_25.txt, test_26.txt, test_27.txt, test_28.txt, test_29.txt, test_30.txt, test_31.txt, test_32.txt, test_33.txt, test_34.txt, test_35.txt, test_36.txt, test_37.txt, test_38.txt, test_39.txt, test_40.txt, test_41.txt, test_42.txt, test_43.txt, test_44.txt, test_45.txt, test_46.txt, test_47.txt, test_48.txt, test_49.txt, test_50.txt, test_51.txt, test_52.txt, test_53.txt, test_54.txt, test_55.txt, test_56.txt, test_57.txt, test_58.txt, test_59.txt, test_60.txt, test_61.txt, test_62.txt, test_63.txt, test_64.txt, test_65.txt, test_66.txt, test_67.txt, test_68.txt, test_69.txt, test_70.txt, test_71.txt, test_72.txt, test_73.txt, test_74.txt, test_75.txt, test_76.txt, test_77.txt, test_78.txt, test_79.txt, test_80.txt
Case Name Status Exec Time Memory
sample_01.txt AC 1 ms 2940 KiB
sample_02.txt AC 1 ms 2928 KiB
sample_03.txt AC 1 ms 2904 KiB
test_01.txt AC 1 ms 2896 KiB
test_02.txt AC 1 ms 2984 KiB
test_03.txt AC 17 ms 9220 KiB
test_04.txt AC 63 ms 27836 KiB
test_05.txt AC 54 ms 24316 KiB
test_06.txt AC 37 ms 17932 KiB
test_07.txt AC 3 ms 4008 KiB
test_08.txt AC 16 ms 9248 KiB
test_09.txt AC 37 ms 19288 KiB
test_10.txt AC 61 ms 27812 KiB
test_11.txt AC 61 ms 27808 KiB
test_12.txt AC 10 ms 7340 KiB
test_13.txt AC 29 ms 15692 KiB
test_14.txt AC 62 ms 27816 KiB
test_15.txt AC 7 ms 6056 KiB
test_16.txt AC 21 ms 12820 KiB
test_17.txt AC 13 ms 7940 KiB
test_18.txt AC 14 ms 8144 KiB
test_19.txt AC 29 ms 15456 KiB
test_20.txt AC 61 ms 27848 KiB
test_21.txt AC 61 ms 27984 KiB
test_22.txt AC 2 ms 3300 KiB
test_23.txt AC 65 ms 27848 KiB
test_24.txt AC 53 ms 27904 KiB
test_25.txt AC 54 ms 27888 KiB
test_26.txt AC 64 ms 27892 KiB
test_27.txt AC 53 ms 27944 KiB
test_28.txt AC 53 ms 27876 KiB
test_29.txt AC 6 ms 6076 KiB
test_30.txt AC 58 ms 27988 KiB
test_31.txt AC 57 ms 28212 KiB
test_32.txt AC 4 ms 4528 KiB
test_33.txt AC 54 ms 24860 KiB
test_34.txt AC 66 ms 27888 KiB
test_35.txt AC 30 ms 17788 KiB
test_36.txt AC 1 ms 3188 KiB
test_37.txt AC 26 ms 16796 KiB
test_38.txt AC 10 ms 6936 KiB
test_39.txt AC 57 ms 27916 KiB
test_40.txt AC 58 ms 27932 KiB
test_41.txt AC 62 ms 27828 KiB
test_42.txt AC 11 ms 7064 KiB
test_43.txt AC 10 ms 7224 KiB
test_44.txt AC 63 ms 27888 KiB
test_45.txt AC 15 ms 9032 KiB
test_46.txt AC 11 ms 7176 KiB
test_47.txt AC 56 ms 24160 KiB
test_48.txt AC 17 ms 9560 KiB
test_49.txt AC 41 ms 19336 KiB
test_50.txt AC 63 ms 27820 KiB
test_51.txt AC 62 ms 27852 KiB
test_52.txt AC 24 ms 14672 KiB
test_53.txt AC 14 ms 8444 KiB
test_54.txt AC 63 ms 27836 KiB
test_55.txt AC 17 ms 9860 KiB
test_56.txt AC 31 ms 16088 KiB
test_57.txt AC 28 ms 16296 KiB
test_58.txt AC 11 ms 7104 KiB
test_59.txt AC 61 ms 27368 KiB
test_60.txt AC 62 ms 27760 KiB
test_61.txt AC 64 ms 27900 KiB
test_62.txt AC 51 ms 27824 KiB
test_63.txt AC 63 ms 27844 KiB
test_64.txt AC 54 ms 27976 KiB
test_65.txt AC 25 ms 16152 KiB
test_66.txt AC 37 ms 18816 KiB
test_67.txt AC 22 ms 13872 KiB
test_68.txt AC 10 ms 7224 KiB
test_69.txt AC 36 ms 19376 KiB
test_70.txt AC 62 ms 27552 KiB
test_71.txt AC 59 ms 27840 KiB
test_72.txt AC 48 ms 22228 KiB
test_73.txt AC 13 ms 8156 KiB
test_74.txt AC 61 ms 28440 KiB
test_75.txt AC 67 ms 27776 KiB
test_76.txt AC 67 ms 27908 KiB
test_77.txt AC 69 ms 28084 KiB
test_78.txt AC 66 ms 27940 KiB
test_79.txt AC 70 ms 27944 KiB
test_80.txt AC 65 ms 27636 KiB