28-4
作者:
kgc
,
2023-02-28 16:20:13
,
所有人可见
,
阅读 153
#include <bits/stdc++.h>
using namespace std;
const int N = 300010;
typedef long long LL;
int n,a[N];
vector<int> son[N];
multiset<int> s[N];
multiset<int> dfs(int u)
{
s[u].insert(a[u]);
if(son[u].size() == 0) return s[u];
vector<multiset<int>> temp;
for(int i=0;i<son[u].size();i++) temp.push_back(dfs(son[u][i]));
for(int i=0;i<temp.size();i++)
{
multiset<int>& t = temp[i];
for(auto j : t) s[u].insert(j);
}
return s[u];
}
LL Count(vector<LL>v)
{
LL ans=0;
if(v.size()==1)
return 0;
LL sz=v.size();
for(LL i=0;i<sz;i++)
{
LL tmp=0x3f3f3f3f3f3f3f3f;
if(i+1>=0&&i+1<sz)
tmp=min((v[i+1]-v[i])*(v[i+1]-v[i]),tmp);
if(i-1>=0&&i-1<sz)
tmp=min((v[i-1]-v[i])*(v[i-1]-v[i]),tmp);
ans+=tmp;
}
return ans;
}
int main()
{
cin>>n;
for(int i=2;i<=n;i++)
{
int fa;
cin>>fa;
son[fa].push_back(i);
}
for(int i=1;i<=n;i++) cin>>a[i];
dfs(1);
for(int i=1;i<=n;i++)
{
vector<LL> res;
for(auto k : s[i]) res.push_back(k);
cout << Count(res) << "\n";
}
return 0;
}