AtCoder Grand Contest 023 F - 01 on Tree
Description
Solution
HNOI-day2-t2
复制上去,删点东西,即可 \(AC\)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1000010;
int n,a[N],w[N],fa[N];
struct data{
ll w;int s,x;
bool operator <(const data &p)const{
if(w*p.s!=p.w*s)return w*p.s<p.w*s;
return x<p.x;
}
}p[N];
set<data>Q;
int cnt=0,b[N];
inline int find(int x){return b[x]==x?x:b[x]=find(b[x]);}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
scanf("%d",&n);
for(int i=2;i<=n;i++)
scanf("%d",&fa[i]);
for(int i=1;i<=n;i++)scanf("%d",&w[i]);
for(int i=1;i<=n;i++){
p[i]=(data){w[i],1,i};
Q.insert(p[i]);b[i]=i;
}
cnt=n;
ll ans=0;
data t;
while(!Q.empty()){
t=*Q.begin();Q.erase(t);
int y=find(fa[t.x]);
if(!y)continue;
ans+=(t.s-t.w)*p[y].w;
Q.erase(p[y]);
data e=t;
e.w+=p[y].w;e.s+=p[y].s;e.x=++cnt;
b[cnt]=cnt;b[y]=cnt;b[find(t.x)]=cnt;
fa[cnt]=fa[y];fa[t.x]=cnt;
p[cnt]=e;
Q.insert(e);
}
cout<<ans<<endl;
return 0;
}