首页 > 其他分享 >ABC348E Minimize Sum of Distances 题解

ABC348E Minimize Sum of Distances 题解

时间:2024-06-13 19:44:11浏览次数:20  
标签:Distances limits Minimize 题解 sum fa int 节点 Sum

ABC348E Minimize Sum of Distances

题目大意

给定一棵共 \(n\) 个节点的树, 第 \(i\) 个点的权重为 \(c_i\)。定义 \(f(x)\) 表示树上所有点到节点 \(x\) 的距离乘上权重,即 \(f(x)=\sum\limits_{i=1}^n(c_i\times dis(x, i))\)。求 \(\min\limits_{u=1}^nf(u)\)。

Solve

一眼换根。

考虑先以节点 \(1\) 为根,则 \(f(1)=\sum\limits_{i=1}^n(c_i\times d_i)\),(\(d_i\) 表示 \(i\) 的深度)。然后考虑换根求 \(f(u),u\in[2,n]\)。

image-20240409193224147

如图,以 \(u=2\) 时为例。记 \(sum_u\) 为当以 \(1\) 为根时 \(u\) 的子树内的点的权值和。当根从 \(fa_2=1\) 转移至 \(2\) 时,对于在 \(2\) 的子树里的节点,他们的深度都减少了 \(1\),那么 \(\sum\limits_{i\in son_2}(c_i\times d_i)\) 就总共减少了 \(sum_u\);对于不在 \(2\) 的子树里的点,他们的深度都增加了 \(1\),共增加 \(sum_1-sum_u\)。整理一下并推广至所有 \(u\in [2,n]\),有: \(f(u)=f(fa_u)-sum_u+sum_1-sum_u\)。

Code

#include<bits/stdc++.h>
#pragma GCC optimize(1,2,3,"Ofast","inline")
using namespace std;
#define int long long
inline int read()
{
	short f=1;
	int x=0;
	char c=getchar();
	while(c<'0'||c>'9')	{if(c=='-')	f=-1;c=getchar();}
	while(c>='0'&&c<='9')	x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x*f;
}
int n,a,b,c[100010],f[100010],ans;
vector<int>e[100010];
void dfs(int u,int fa,int d)
{
	f[1]+=d*c[u];
	for(auto i:e[u])
		if(i!=fa)	dfs(i,u,-~d),c[u]+=c[i];
}
void dp(int u,int fa)
{
	for(auto i:e[u])
		if(i!=fa)	f[i]=f[u]-c[i]+c[1]-c[i],dp(i,u);
}
signed main()
{
	n=read();
	for(int i=1;i<n;i=-~i)
		a=read(),b=read(),
		e[a].push_back(b),e[b].push_back(a);
	for(int i=1;i<=n;i=-~i)	c[i]=read();
	dfs(1,0,0);ans=f[1];dp(1,0);
	for(int i=1;i<=n;i=-~i)	ans=min(ans,f[i]);
	return printf("%lld",ans),0;
}

标签:Distances,limits,Minimize,题解,sum,fa,int,节点,Sum
From: https://www.cnblogs.com/sorato/p/18246653

相关文章

  • AT_abc335_d [ABC335D] Loong and Takahashi 题解
    题目传送门题目大意:高桥在一个地图的中心,有一条龙从地图的左上角开始,每次只能到达与他相邻的四个点,现给出地图的边长,请你给出一种方案,使得地图上的每个点除高桥所在的地方外,都被龙走过且不重复。解题思路:首先,我们拿到这个题目,想十秒,便会发现,我们按照螺旋矩阵的方式行走,......
  • 【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 团队派遣(100分) - 三语言AC题解(Py
    ......
  • 【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA与朋友们的石头剪刀布游戏(100分
    ......
  • CF244A的题解
    前言:这题很水,只能评红。代码也很短。之前分析的不是很好,现在改了,感谢大家指出错误。这题给出n×kn×kn×k......
  • 2024/6/12高一高考集训欢乐赛题解
    目录赛时榜T1.Efim与奇怪的成绩T2.美丽的IP地址赛时榜你说得对,但是安禄山进长安——\(\huge{唐完了}\)。T1.Efim与奇怪的成绩贪心题+小模拟。先说结论:从小数点往后找到第一个可以四舍五入的位置,然后开始四舍五入。证明:首先,小数位数靠后的如果四舍五入,收益肯定是没前面的......
  • 【问题解决】java.util.jar.JarException: file:bcprov-jdk18on-1.78.jar is not sign
    现象启动程序报错,同时在classpath下有多个bcprov-jdk开头的包Causedby:java.util.jar.JarException:file:/C:/Users/93986/.gradle/caches/modules-2/files-2.1/org.bouncycastle/bcprov-jdk18on/1.78/619aafb92dc0b4c6cc4cf86c487ca48ee2d67a8e/bcprov-jdk18on-1.78.jaris......
  • 掌握调试艺术:提升开发效率与问题解决的策略
    调试作为开发中不可或缺的一环,其重要性不言而喻。若尚未掌握此技能,不仅可能影响团队的整体进度,还会限制个人的开发效率。虽然在线资源提供了快速解决问题的途径,但过度依赖可能阻碍深入培养扎实的调试能力。认识到调试技能的重要性,意味着将有更多精力投入到其他富有创造性的工作......
  • python安装库失败问题解决
    相信很多小伙伴在安装python软件包时候会遇到各种各样的报错吧,为此针对这些问题我进行了汇总并解决。 此时,使用cmd,pipinstall--相应包名称  这里需要升级一下pip,python.exe-mpipinstall--upgradepip然后按照操作一步步就可以解决咯。 ......
  • atcoder 官方dp题单题解(持续更新)
    题单链接:https://atcoder.jp/contests/dp/tasks洛谷搜索:https://www.luogu.com.cn/problem/list?keyword=at_dp&type=AT|B|CF|P|SP|UVA&page=1A题目链接:https://atcoder.jp/contests/dp/tasks/dp_a简单线性dp.dp[i]表示在i这个位置的最小代价,转移的时候把两种选择都考虑......
  • 题解:P5786 [CQOI2008] 传感器网络
    题意从一个\(n\)个结点的有向无环图里选出\(n-1\)条边,构成一棵树,且除根节点以外的点的儿子个数的最大值最小。输出满足题意的节点的父亲,要求字典序最小。思路我们肯定要先把最小值求出来。很容易看出是拆点+二分答案求解,这里要注意的是拆完的两个点是不用连起来的,将......