#include<bits/stdc++.h>
using namespace std;
const int MAXN=150,MAX=5*1e6;
int DP[MAX],cost[MAXN+1][MAXN+1],trace[MAX];
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... |