rt。 赛时代码发现需要高精。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int , int> pi;
#define endl '\n'
#define int long long
const int N = 2e5 + 10;
int n;
int a[N] , p[N];
bool vis[N];
vector<int> g[N];
vector<int> r[N];
bool mark[N];
int tot , bel[N] , w[N];
void dfs(int u , int idx) {
mark[u] = 1 , bel[u] = idx;
r[idx].push_back(u) , w[u] = r[idx].size() - 1;
for (auto v : g[u]) {
if (!mark[v]) dfs(v , idx);
}
}
int lcm(int x , int y) {
return x * y / __gcd(x , y);
}
signed main() {
ios::sync_with_stdio(0) , cin.tie(0) , cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) cin >> p[i] , g[i].push_back(p[i]);
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) if (!mark[i]) dfs(i , ++tot);
int res = 0 , cnt = 1;
for (int i = 1; i <= n; i++) {
int siz = r[bel[i]].size() , _bel = bel[i];
int pos = (res + w[i]) % siz;
int u = pos , mi = a[r[_bel][pos]];
int x = res;
while (1) {
// cout << u << ' ';
vis[u] = 1;
mi = min(mi , a[r[_bel][u]]);
if (a[r[_bel][u]] == mi) res = x;
int nxt = (u + cnt) % siz;
if (vis[nxt]) break;
u = nxt;
x += cnt;
}
// cout << endl;
for (int j = 0; j < siz; j ++) vis[j] = 0;
cnt = lcm(cnt , siz);
// cout << "--" << mi << '\n';
cout << mi << ' ';
}
cout << endl;
return 0;
}