| 比赛 |
果蝇王邀请赛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;
}