#include<bits/stdc++.h>
using namespace std;
const int MAXN=150,MAX=5*1e6;
int DP[MAX],cost[MAXN+1][MAXN+1],trace[MAXN+1];
int c[MAXN+1],order[MAXN+1];
bool vis[MAXN+1];
vector<vector<int>> graph(MAXN+1);
bool cmp(int i,int j){
    return (c[i]<c[j]);
}
int sz=0;
void DFS(int u){
    sz++;
    vis[u]=true;
    for(int v:graph[u]){
        if(!vis[v]){
            DFS(v);
        }
    }
}
int base[MAXN+1],cnt[MAXN+1],pro[MAXN+1];
int m=0;
vector<int> decode(int x){
    vector<int> v(m);
    for(int i=m-1;i>=0;i--){
        v[i]=x%base[i];
        x/=base[i];
    }
    return v;
}
int idx[MAXN+1];
void getans(int u,int l,int r){
    vis[u]=true;
    for(int v:graph[u]){
        if(!vis[v]){
            if((idx[u]-l)&1){
                idx[v]=idx[u]-2;
            }
            else{
                if(idx[u]+2<=r){
                    idx[v]=idx[u]+2;
                }
                else if(idx[u]<r){
                    idx[v]=r;
                }
                else{
                    idx[v]=r-1;
                }
            }
            getans(v,l,r);
        }
    }
}
signed main(){
    //freopen("vrtic.inp","r",stdin);
    //freopen("vrtic.out","w",stdout);
    int subtask,n;
    //cin >> subtask;
    cin >> n;
    for(int i=1;i<=n;i++){
        int p;
        cin >> p;
        graph[i].push_back(p);
        graph[p].push_back(i);
    }
    for(int i=1;i<=n;i++){
        cin >> c[i];
        order[i]=i;
    }
    sort(order+1,order+n+1,cmp);
    vector<vector<int>> group(n+1);
    vector<pair<int,int>> root;
    int mp[n+1]={0};
    for(int i=1;i<=n;i++){
        if(!vis[i]){
            sz=0;
            DFS(i);
            group[sz].push_back(i);
            mp[sz]++;
        }
    }
    int limit=1;
    for(int i=1;i<=n;i++){
        if(mp[i]==0){
            continue;
        }
        base[m]=mp[i]+1;
        cnt[m]=i;
        m++;
        limit*=(mp[i]+1);
    }
    pro[m-1]=1;
    for(int i=m-2;i>=0;i--){
        pro[i]=pro[i+1]*base[i+1];
    }
    for(int x=0;x<limit;x++){
        DP[x]=1e9;
        trace[x]=-1;
    }
    DP[0]=0;
    for(int l=1;l<=n;l++){
        cost[l][l]=0;
        for(int r=l+1;r<=n;r++){
            cost[l][r]=cost[l][r-1];
            if(l+1==r){
                cost[l][r]=c[order[r]]-c[order[l]];
            }
            else{
                cost[l][r]=max(cost[l][r],c[order[r]]-c[order[r-2]]);
            }
        }
    }
    for(int x=0;x+1<limit;x++){
        vector<int> c=decode(x);
        int l=1;
        for(int i=0;i<m;i++){
            l+=(c[i]*cnt[i]);
        }
        for(int i=0;i<m;i++){
            if(c[i]+1<base[i]){
                if(DP[x+pro[i]]>max(DP[x],cost[l][l+cnt[i]-1])){
                    DP[x+pro[i]]=max(DP[x],cost[l][l+cnt[i]-1]);
                    trace[x+pro[i]]=i;
                }
            }
        }
    }
    cout << DP[limit-1] << endl;
    vector<int> p;
    int x=limit-1;
    while(x>0){
        p.push_back(cnt[trace[x]]);
        x-=pro[trace[x]];
    }
    memset(vis,false,sizeof(vis));
    reverse(p.begin(),p.end());
    int l=1;
    for(int i=0;i<p.size();i++){
        idx[group[p[i]].back()]=l;
        getans(group[p[i]].back(),l,l+p[i]-1);
        l+=p[i];
        group[p[i]].pop_back();
    }
    for(int i=1;i<=n;i++){
        idx[i]=order[idx[i]];
    }
    for(int i=1;i<=n;i++){
        cout << c[idx[i]] << ' ';
    }
    cout << endl;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |