传送门

Solution

fi,kf_{i,k} 表示经过 2k2^k 次操作后,位置 ii 上的数字为 afi,ka_{f_{i,k}}。初始化 fi,0=xif_{i,0}=x_i。转移方程

fi,j=ffi,j1,j1f_{i,j}=f_{f_{i,j-1},j-1}

Code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const ll N = 2e5 + 10, logN = 62;

ll n, k, a[N], x[N], f[N][logN + 5], t, ans[N];

int main()
{
    scanf("%lld%lld", &n, &k);
    for (int i = 1; i <= n; i++)
        scanf("%lld", &f[i][0]);
    for (int i = 1; i <= n; i++) {
        scanf("%lld", &a[i]);
        ans[i] = i;
    }
    for (int j = 1; j <= logN; j++)
        for (int i = 1; i <= n; i++)
            f[i][j] = f[f[i][j - 1]][j - 1];
    for (int i = 1; i <= n; i++) {
        t = k;
        for (int j = logN; j >= 0 && t > 0; j--) {
            if (t < (1ll << j))
                continue;
            t -= (1ll << j);
            ans[i] = f[ans[i]][j];
        }
    }
    for (int i = 1; i <= n; i++)
        printf("%lld ", a[ans[i]]);
    return 0;
}