はまやんはまやんはまやん

hamayanhamayan's blog

Permutation [第二回 アルゴリズム実技検定 E]

https://atcoder.jp/contests/past202004-open/tasks/past202004_e

解説

https://atcoder.jp/contests/past202004-open/submissions/12895699

各整数iについて、操作をシミュレーションして、条件を満たす整数jを答える。
そのまま、配列Aを受け取ると、「A[x] := xから1回の操作を行った後の値」となっている。
0-indexedでやっている場合は、A[x]--をしておこう。
これで、シミュレーションをしていく。
条件はx != iであるなら操作を継続するようにやっていけばいい。
初期状態をx=iとしてしまうと、操作を継続できないので、最初の1手だけ最初に行う。
これで各iについて、それぞれ答えれば答え。

int N, A[101];
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N;
    rep(i, 0, N) cin >> A[i], A[i]--;

    rep(i, 0, N) {
        int x = A[i];
        int j = 1;
        while (x != i) {
            x = A[x];
            j++;
        }

        if(i) printf(" ");
        printf("%d", j);
    }
    printf("\n");
}