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;
}

posted @ 2018-04-28 21:42  PIPIBoss  阅读(378)  评论(0编辑  收藏  举报