灵异事件!
查看原帖
灵异事件!
651786
yyc_楼主2023/3/11 09:45
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
const ll N=2e5+10;
ll n,T;
ll to[N<<1],tt,nt[N<<1],hd[N], dep[N];
ll sz[N],dp[N],sum[N], gg[N];
ll fa[N],a[N];
void push(ll u,ll v){
	to[++tt]=v;
	nt[tt]=hd[u];
	hd[u]=tt;
}
vector<ll> tmp;
bool cmp(ll a, ll b) {
	int u = a, v = b;
	return sz[u]*sum[v]<sz[v]*sum[u];
}
int smsm[N], smsz[N];
void dfs(ll nw){
	int v=a[nw];
	sz[nw]=1;
	sum[nw]=a[nw];
	for(int i=hd[nw];i;i=nt[i]){
		dfs(to[i]);
		dep[nw]=max(dep[nw],dep[to[i]]);
		sz[nw]+=sz[to[i]];
		sum[nw]+=sum[to[i]];
	}
	dep[nw]++;
	tmp.clear();
	for(int i=hd[nw];i;i=nt[i])
		tmp.push_back(to[i]);
	sort(tmp.begin(),tmp.end(),cmp);
	ll p=1,ans = 1e18,maxdep = 0;
	for(int i=0;i<tmp.size();i++){
		ll v=tmp[i];
		maxdep = max(maxdep,dep[v]);
		dp[nw]+=p*sum[v]+dp[v];
		p+=sz[v]*2;
		smsz[i] = p;
		smsm[i] = smsm[i-1] + sum[v];
	}
	for(int i=0;i<tmp.size();i++){
		ll v=tmp[i];
		if(dep[v] != maxdep) continue;
		ans = min(ans,
			dp[nw]
			- dp[v] - (i?smsz[i-1]:1)*sum[v]
			- sz[v]*2*(smsm[tmp.size()-1] - smsm[i])
			+ gg[v] + (smsz[tmp.size()-1] - 2*sz[v]) * sum[v]
		);
	}
	gg[nw] = ans;
	if(tmp.size() == 0) gg[nw] = 0;
}
signed main(){
	scanf("%lld %lld",&n,&T);
	for(int i=2;i<=n;i++){
		scanf("%lld %lld",&fa[i],&a[i]);
		push(fa[i],i);
	}
	dfs(1);
	printf("%lld %lld\n",sz[1]*2-2-(T==0?0:dep[1]-1),(T==0?dp[1]:gg[1]));
	return 0;
}

T=1,全错了 调抑郁了/kel

2023/3/11 09:45
加载中...