0%

ABC367E Permute K times

传送门

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

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;
}