倍增
裸的基环树上倍增水题。
不难发现:输入的
记录
对于每一个节点,还是倍增找答案。
因为
之后就秒了。
#include <bits/stdc++.h>
#define int long long
#define MAXN 1000005
using namespace std;
int n, k, x[MAXN], anc[MAXN][61], a[MAXN];
signed main() {
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> x[i];
anc[i][0] = x[i];
}
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i <= 60; i++)
for (int j = 1; j <= n; j++)
anc[j][i] = anc[anc[j][i - 1]][i - 1];
for (int i = 1; i <= n; i++) {
int nowk = k, nowi = i;
for (int j = 60; j >= 0; j--) {
if (nowk >= (1ll << j)) {
nowk -= (1ll << j);
nowi = anc[nowi][j];
}
}
cout << a[nowi] << " ";
}
return 0;
}