萌新求助,改过ll没用,对了一半的点
查看原帖
萌新求助,改过ll没用,对了一半的点
33063
Focus_on楼主2021/8/2 17:03

rt

#include<cstdio>
#include<algorithm>

using namespace std;

struct EDGE{
	int v,d1,d2,nxt;
}edge[400010];

int n,m,s,u,v,d1,d2,head[200010],dep[200010],e;
int fa[200010][21];
long long cha[200010],ans;

void add_edge(int u,int v,int d1,int d2){
	e++;
	edge[e].v=v;
	edge[e].d1=d1;
	edge[e].d2=d2;
	edge[e].nxt=head[u];
	head[u]=e;
}

void dfs(int x,int fat,int dp){
	
	fa[x][0]=fat;
	dep[x]=dp;
	
	for(int i=1;i<=20;i++)
		fa[x][i]=fa[fa[x][i-1]][i-1];
		
	for(int i=head[x];i;i=edge[i].nxt)
	if(edge[i].v!=fat) dfs(edge[i].v,x,dp+1);
}

int lca(int x,int y){
	
	if(dep[x]<dep[y]) swap(x,y);
	
	for(int i=20;i>=0;i--)
		if(dep[fa[x][i]]>=dep[y]) x=fa[x][i];
	
	for(int i=20;i>=0;i--)
		if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
		
	return fa[x][0];
}

void dfs2(int x){
	
	for(int i=head[x];i;i=edge[i].nxt){
		if(edge[i].v==fa[x][0]) continue;
		dfs2(edge[i].v);
		cha[x]+=cha[edge[i].v];
		if(cha[edge[i].v]*edge[i].d1<=edge[i].d2) ans+=cha[edge[i].v]*edge[i].d1;
		else ans+=edge[i].d2;
	}
	
	return;
}

int main(){

	scanf("%d",&n);
	
	for(int i=1;i<n;i++){
		scanf("%d%d%d%d",&u,&v,&d1,&d2);
		add_edge(u,v,d1,d2);
		add_edge(v,u,d1,d2);
	}
	
	dfs(1,1,0);
	
	for(int i=1;i<n;i++){
		int j=i+1;
		cha[i]++; cha[j]++;
		cha[lca(i,j)]-=2;
	}
	
	dfs2(1);
	
	printf("%lld\n",ans);
	
	return 0;
}
2021/8/2 17:03
加载中...