40pts求调教
查看原帖
40pts求调教
721959
封禁用户楼主2024/6/7 14:36
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){f=ch=='-'?-f:f;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return x*f;
}
const int N=200005;
//son 必须最后选
int n,h[N],ne[N<<1],t[N<<1],T,dep[N],cnt,siz[N],sum[N],a[N],son[N],Dep[N],ans;
vector<int>p[N];
void asd(int x,int y){
	t[++cnt]=y;
	ne[cnt]=h[x];
	h[x]=cnt;
}
void dfs(int u,int fa){
	siz[u]=1;
	sum[u]=a[u];
	dep[u]=dep[fa]+1;
	Dep[u]=dep[u];
	for(int e=h[u];e;e=ne[e]){
		if(t[e]==fa)continue;
		dfs(t[e],u);
		siz[u]+=siz[t[e]];
		sum[u]+=sum[t[e]];
		Dep[u]=max(Dep[u],Dep[t[e]]);
		if(T==1){
			if(Dep[t[e]]>Dep[son[u]])son[u]=t[e];
			else if(Dep[t[e]]==Dep[son[u]]&&siz[t[e]]*sum[son[u]]>siz[son[u]]*sum[t[e]])son[u]=t[e];
		}
	}
}
bool cmp(int i,int j){
	return siz[j]*sum[i]>siz[i]*sum[j];
}
void dfs2(int u,int fa,int tim){
//	printf("%lld\n",u);
	ans+=tim*a[u];
	for(int e=h[u];e;e=ne[e])if(t[e]!=fa)p[u].push_back(t[e]);
	sort(p[u].begin(),p[u].end(),cmp);
	int l=p[u].size();
	for(int i=0;i<l;++i){
		if(son[u]!=p[u][i]){
			dfs2(p[u][i],u,tim+1);
			tim+=siz[p[u][i]]*2;
		}
	}
	if(T==1&&son[u]){//son u
		dfs2(son[u],u,tim+1);
		tim+=siz[son[u]];
	}
}
signed main(){
	n=read();T=read();
	for(int i=2;i<=n;++i){
		int x;
		x=read();a[i]=read();
		asd(i,x);asd(x,i);
	}
	dep[0]=-1;
	dfs(1,0);
	if(T==1)cout<<(n<<1ll)-Dep[1]-2<<' ';
	else cout<<(n<<1ll)-2<<' ';
//	printf("big son is %lld\n",son[3]);
	dfs2(1,0,0);
	cout<<ans;
}

码风“优良”

2024/6/7 14:36
加载中...