传送门
Solution
设 fi,k 表示经过 2k 次操作后,位置 i 上的数字为 afi,k。初始化 fi,0=xi。转移方程
fi,j=ffi,j−1,j−1
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| #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; }
|