ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF348B Solution

2021-09-24 15:02:06  阅读:113  来源: 互联网

标签:va ch frac int Solution CF348B 权值 节点


题解

因为一棵树的权值被根节点各子节点的子树平分,因此可以求出叶子节点\(i\)的权值对根节点的贡献,设其为\(\frac{1}{va_i}\)。也就是说,对于节点\(i\),\(1\)权值的比重是\(\frac{1}{va_i \cdot a_i}\),而目标就是将这些叶子节点单位权值的比重统一,并使其最小。因为随着\(a_i\)减小,\(\frac{1}{va_i \cdot a_i}\)增大,所以最终的单位权值比重不会小于\(\frac{1}{va_i \cdot a_i}\)的最大值,且可以被所有\(va_i\)整除(使其他叶子节点能够变化过来)。求出\(lcm(a_i)_{i=1}^n\)小于等于\(min(va_i\cdot a_i)_{i=1}^n\)的最大倍数,也就是剩余的节点权值和,用初始权值和减去它即为答案。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10,inf=0x3f3f3f3f3f3f3f3f;
int fst[N],nxt[2*N],v[2*N],cnt;
int a[N],va[N],mi=inf,lcm=1,sum;
inline int read()
{
	int s=0,w=1; char ch=getchar();
	while(ch<'0' || ch>'9') {if(ch=='-') w=-1; ch=getchar();}
	while(ch>='0' && ch<='9') s=s*10+ch-'0',ch=getchar();
	return s*w;
}
void add(int x,int y)
{
	v[++cnt]=y;
	nxt[cnt]=fst[x],fst[x]=cnt;
}
int gcd(int x,int y) {return (!y)?x:gcd(y,x%y);}
void dfs(int x,int fa)
{
	lcm=lcm*va[x]/gcd(lcm,va[x]);
	if(va[x]>sum || va[x]<0) {printf("%lld",sum); exit(0);}
	int tmp=0,y;
	for(int i=fst[x];i;i=nxt[i])
		if(v[i]!=fa) tmp++;
	if(!tmp) mi=min(mi,va[x]*a[x]);
	for(int i=fst[x];i;i=nxt[i])
	{
		y=v[i];
		if(y==fa) continue;
		va[y]=va[x]*tmp; dfs(y,x);
	}
}
signed main()
{
	int n=read(),x,y;
	for(int i=1;i<=n;i++) a[i]=read(),sum+=a[i];
	for(int i=1;i<n;i++) 
	{
		x=read(),y=read();
		add(x,y),add(y,x);
	}
	va[1]=1; dfs(1,0);
	printf("%lld",sum-mi/lcm*lcm);
	return 0;
}

标签:va,ch,frac,int,Solution,CF348B,权值,节点
来源: https://www.cnblogs.com/violetholmes/p/15330439.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有