提交时间:2025-12-20 13:40:05
运行 ID: 39154
#include<bits/stdc++.h> using namespace std; #define int long long #define lson t[pos].ls #define rson t[pos].rs #define pii pair<int,int> #define fr first #define sc second #define mk make_pair #define inx(u) int I=h[(u)],v=edge[I].v;I;I=edge[I].nx,v=edge[I].v int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;} const int MAXN=200010; int n,m,a[MAXN],s[MAXN]; struct node{ int x,p0,sz; bool operator<(const node&G)const{ return p0*G.sz<G.p0*sz; } }; priority_queue<node>Q; int fa[MAXN],siz[MAXN],val[MAXN]; int fid(int x){return fa[x]==x?x:fa[x]=fid(fa[x]);} void slv(){ n=read(); for(int i=2;i<=n;i++)a[i]=read(); for(int i=1;i<=n;i++)s[i]=read(),Q.push({i,!s[i],1}),fa[i]=i,siz[i]=1,val[i]=!s[i]; int ans=0; while(!Q.empty()){ while(!Q.empty()&&siz[Q.top().x]!=Q.top().sz)Q.pop(); int u=Q.top().x,v=fid(a[u]);Q.pop(); ans+=(siz[v]-val[v])*val[u]; fa[u]=v,siz[v]+=siz[u],val[v]+=val[u]; if(v)Q.push({v,val[v],siz[v]}); } printf("%lld",ans); } signed main(){ // freopen("1.in","r",stdin);freopen("1.out","w",stdout); slv(); // cerr<<(clock()*1.0)/CLOCKS_PER_SEC<<"s\n"; return 0; }