比赛 果蝇王邀请赛div2 评测结果 AATTTTTAAAAAATTTTTTT
题目名称 蜜雪冰城甜蜜蜜 最终得分 40
用户昵称 郑霁桓 运行时间 37.230 s
代码语言 C++ 内存使用 3.51 MiB
提交时间 2026-08-27 12:59:03
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
long long n,fa[705],a[705],op1,op2,b[705],ct[705],vs[705],as=1e18,t;
vector<int>v[705];
inline void ad(int x){
    while(x){
        ct[x]++;
        x=fa[x];
    }
    return;
}
inline void df(int x,int y){
    if(!y) return;
    vs[x]=1;
    for(int i=0;i<v[x].size();i++){
        df(v[x][i],y-1);
    }
    return;
}
inline void dfs(int x,int y,long long s){
    if(s>as) return;
    if(x>y){
        t=0;
        for(int i=1;i<=n;i++) ct[i]=vs[i]=0;
        for(int i=1;i<=y;i++) ad(b[i]);
        for(int i=1;i<=n;i++) df(i,ct[i]);
        for(int i=1;i<=n;i++) if(!vs[i]) return;
        as=min(as,s);
        return;
    }
    for(int i=1;i<=n;i++){
        b[x]=i;
        dfs(x+1,y,s+a[i]);
    }
    return;
} 
int main(){
    freopen("sweet.in","r",stdin);
    freopen("sweet.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n,op1=op2=1;
    for(int i=2;i<=n;i++){
        cin>>fa[i],v[fa[i]].push_back(i);
        v[i].push_back(fa[i]);
        if(fa[i]!=1) op1=0;
        if(fa[i]!=i-1) op2=0;
    }
    for(int i=1;i<=n;i++) cin>>a[i];
    if(op1){
        long long mn=1e18;
        for(int i=1;i<=n;i++) mn=min(mn,a[i]);
        cout<<mn*2ll;
        return 0;
    }
    if(op2){
        long long as=1e18;
        for(int i=1;i<=n;i++) as=min(as,a[i]*(n-i+1));
        cout<<as;
        return 0;
    }
    for(int i=1;i<=n;i++) dfs(1,i,0);
    cout<<as;
    return 0;
}