How G?
  • 板块学术版
  • 楼主Ice_lift
  • 当前回复14
  • 已保存回复16
  • 发布时间2024/9/14 21:41
  • 上次更新2024/9/15 09:27:39
查看原帖
How G?
857626
Ice_lift楼主2024/9/14 21:41

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;
}
2024/9/14 21:41
加载中...