60pts+40wa玄学写法求调
查看原帖
60pts+40wa玄学写法求调
398165
cysylzk123楼主2023/9/3 09:18
#include<bits/stdc++.h>
using namespace std;
const long long M1=20000,M2=1e16;
long long n,dw[M1],ls[M1],rs[M1];
long long vi[M1],fg[M1],ct;
long long ans,o1=M2;

void dfs(long long id,long long ft){
	fg[id]=ft;
	if(ls[id]){
		dfs(ls[id],id);
		dw[id]+=dw[ls[id]];
		vi[id]+=dw[ls[id]]+vi[ls[id]];
	}
	if(rs[id]){
		dfs(rs[id],id);
		dw[id]+=dw[rs[id]];
		vi[id]+=dw[rs[id]]+vi[rs[id]];
	}
}

void ds(long long id,long long lt,long long ct){
	if(id==0){
		return;
	}
	if(lt==ls[id]){
		ans+=vi[rs[id]]+dw[rs[id]];
	}
	if(lt==rs[id]){
		ans+=vi[ls[id]]+dw[ls[id]];
	}
	ans+=ct*(dw[1]-dw[lt]);
	ds(fg[id],id,ct+1);
}

int main(){
	scanf("%lld",&n);
	for(long long i=1;i<=n;i++){
		scanf("%lld%lld%lld",&dw[i],&ls[i],&rs[i]);
	}
	//cout<<endl;
	dfs(1,0);
	//cout<<dw[1]<<endl;
	long long num=0;
	for(long long k=n;k>=1;k--){
		ans=vi[k];
		ds(fg[k],k,1);
		//cout<<k<<" "<<vi[k]<<" "<<ans<<endl;
		o1=min(o1,ans);
		if(o1==ans) num=k;
	}
	//cout<<num<<endl;
	cout<<o1<<endl;
	return 0;
}
2023/9/3 09:18
加载中...