#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

struct Data {
  int x,s0,s1;
  Data() {}
  Data(int a,int b,int c):x(a),s0(b),s1(c) {}
  bool operator < (const Data & b) const {
  	if ((ll)s0*b.s1!=(ll)s1*b.s0) return (ll)s0*b.s1<(ll)s1*b.s0;
  	else return s0<b.s0;
  }
};

priority_queue <Data> q;

namespace SETS {

int fa[200005];

void init(int n) {
  for(int i=1;i<=n;i++) fa[i]=i;
}

int find_father(int x) {
  return (fa[x]==x)?x:fa[x]=find_father(fa[x]);
}

void merge(int x,int y) {
  x=find_father(x);y=find_father(y);
  if (x==y) return;
  fa[y]=x;
}

}

bool vis[200005];
int sum0[200005],sum1[200005]; 
ll f[200005];

int p[200005];

int main() {
  int n;
  scanf("%d",&n);
  for(int i=2;i<=n;i++) scanf("%d",&p[i]);
  vis[0]=1;
  for(int i=1;i<=n;i++) {
  	int x;
  	scanf("%d",&x);
  	if (!x) {
  		sum0[i]=1;
  		q.push(Data(i,1,0));
	  }
	else {
		sum1[i]=1;
		q.push(Data(i,0,1));
	}
  }
  SETS::init(n);
  ll ans=0;
  int s1=0;
  while (!q.empty()) {
  	Data t=q.top();q.pop();
  	if (vis[t.x]||t.s0!=sum0[t.x]||t.s1!=sum1[t.x]) continue;
  	int x=t.x;
  	vis[x]=1;
  	if (vis[SETS::find_father(p[x])]) {
  		ans+=f[x]+(ll)s1*sum0[x];
  		s1+=sum1[x];
	  }
	else {
		int u=SETS::find_father(p[x]);
		f[u]+=f[x]+(ll)sum1[u]*sum0[x];
		sum0[u]+=sum0[x];
		sum1[u]+=sum1[x];
		q.push(Data(u,sum0[u],sum1[u]));
		SETS::merge(u,x);
	}
  }
  printf("%lld\n",ans);
  return 0;
}