首页 > 其他分享 >一种类型的树贪心

一种类型的树贪心

时间:2024-10-22 20:10:04浏览次数:8  
标签:sz cdot sum 合并 然后 一种 即可 类型 贪心

AGC 023 F - 01 on Tree

从根开始往下顺序不太好处理,于是考虑从下往上。

那么就是从叶子开始,向自己的父亲合并,我们对于一个点,它有若干个儿子,假设其中两个叶子儿子分别为 \(x,y\),然后考虑谁先合并上来更优?显然是颜色为 \(0\) 的先合并。

然后叶子合并完后每个点会变成连通快,我们扩展成连通块 \(x,y\),记:\(c_{0/1,u}\) 表示 \(u\) 所在连通块的 \(0/1\) 数量。

那么如果先合并 \(x\) 就有:\(c_{1,x}\cdot c_{0,y}< c_{0,x}\cdot c_{1,y}\),移项就是:\(\frac{c_{1,y}}{c_{0,y}}<\frac{c_{1,x}}{c_{0,x}}\),那么我们就将所有叶子插入一个优先队列,然后选择这个值最小的,向它的父亲合并即可,用并查集维护 \(c_{0/1,x}\)。然后将父亲插入队列。

这题可以简单点写法,不需要先合并叶子(答案不影响,因为儿子迟早合并上来计算,且计算结果不变),将所有点都插入队列,然后类似 dijkstra,因为一个点合并完之后某个点的父亲点一定比值变小,所以用一个 bool 数组记录一下是否已经合并过了即可。

时间复杂度:\(O(n\log n)\)。

代码

ABC 376 G - Treasure Hunting

确定一个排列 \(q\),使得树上任意点父亲的位置在这个点前面。

然后要使得以下值最小化:

\[\sum_{i=1}^n a_{q_i}\times i \]

然后这一题容易发现,还是和上一题类似,要让 \(a\) 序列的顺序对数尽量小即可(接近降序排序)。

这里有两种思路,但是最后代码写法是一样的。

考虑算贡献:

对于某个点的一对儿子 \((x,y)\),如果先合并 \(x\) 优于先合并 \(y\),那么就有:

\[sz_x\cdot sum_y < sz_y\cdot sum_x\\ \frac{sz_x}{sum_x}<\frac{sz_y}{sum_y} \]

于是并查集维护权值和、大小即可贪心。

考虑转换为上一题

对于 \(a_i\) 这个权值,倒过来排序,直接将 \(a_i\) 视为 \((0,0\dots 0,1)\),其中有 \(a_i\) 个 \(0\),然后变成第一道题目。

那么 \(0\) 正好就是权值和,\(1\) 就是大小,按照 \(\frac{c_1}{c_0}\) 排序即可。

最后算答案就是这么合并即可:

\[u\to v\\ ans_u = ans_u + ans_v + sz_v\cdot sum_u \]

时间复杂度:\(O(n\log n)\)。

代码

标签:sz,cdot,sum,合并,然后,一种,即可,类型,贪心
From: https://www.cnblogs.com/weirdoX/p/18493653

相关文章

  • 使用 `com.google.gson` 库将 Java 对象转换为 JSON 字符串,并且确保 `data` 字段是 `M
    要使用com.google.gson库将Java对象转换为JSON字符串,并且确保data字段是Map<String,Object>类型的,你可以按照以下步骤编写一个示例代码。这个示例代码将创建一个包含data字段的Java对象,并将data字段初始化为一个Map<String,Object>,然后动态地向其中添加......
  • 常见软著可申请的类型
    **可以申请软著的有哪些?1、计算机软件:这是最常见的申请对象,包括操作系统、应用程序、数据库管理系统等。软件著作权保护的是软件的源代码和目标代码,以及相关的文档和用户手册等。2、游戏软件:游戏行业的需求中,一款游戏上架的前提条件是必须拥有软件著作权。3、教育软......
  • 004 Python数据类型
    1#int可以将纯整数构成的字符串转换成整型,若包含其它非整数符号则会报错2s='123'3res=int(s)4print(res,type(res))56#s='12.3'7#res=int(s)8#print(res,type(s))910#十进制与其它进制之间的相互转换11#十进制转其它进制12print......
  • Go 语言的数据类型转换有哪些?
    当不同的数据类型相互操作的时候,就需要类型转换,Go的数据类型转换还是比较简单的。数据类型转换包含显式和隐式两类,隐式的一般是大的数据类型到小的类型进行转换,不会有精度丢失的问题。否则就需要进行显式转换。转换的场景包括:有数学计算、赋值、函数调用、数据库交互、JSON编......
  • CATIA软件许可类型全解析
    在工程设计领域,CATIA软件以其强大的功能和卓越的性能赢得了广泛的认可。作为一款领先的3D建模软件,CATIA为各行各业的设计师和工程师提供了强大的支持。然而,对于许多初次接触CATIA的用户来说,了解其不同的许可类型可能是一个挑战。本文将为您详细介绍CATIA软件的许可类型,帮助您选择......
  • js类型判断(实用,不拖拉)
    本文介绍三种js类型判断方法。一、typeof(有坑)语法:typeof(表达式)、typeof变量名返回值:undefined/boolean/string/number/object/function/symbol/bigint示例:typeofundefined//undefinedtypeoftrue//booleantypeof'1'//stringtypeof1//numbertypeofn......
  • FFC/FPC插座的类型有几种,一般型号命名方式是怎样的
    FPC/FFC插座间距分别有0.3mm,0.5mm,0.8mm,1.0mm,1.25mm,2.54mm。 规格包含:翻盖式,上接式,下接式,抽拉式,立式,双面接触,单面接触,卧式。触角分别有:180°直插型,90°折弯型,SMT贴片型。    FPC连接器,即柔性印刷电路板连接器,是一种用于连接柔性电路板和PCB板的电子元件。以......
  • 在K8S中,有一种情况,公司希望向具有各种环境的客户提供所有必需的分发,他们如何以动态的
    在Kubernetes(K8S)中,公司若希望向具有各种环境的客户提供所有必需的分发,并以动态的方式实现这一关键目标,可以遵循以下步骤和策略:1.多环境部署策略创建不同的命名空间在Kubernetes中,命名空间是一种将集群内部资源(如Pod、Service等)分组的方式。公司可以为每个客户或环境创建一个......
  • JavaScript从零学起 —— 数据类型(进阶篇6)
    说明:此文章用作个人学习记录,若有任何问题或建议欢迎大家在评论区讨论文章目录前言一、日期(Date)1.Date类型的定义2.创建Date3.常用方法4.日期格式化5.常见问题与解决方案二、正则表达式(RegExp)1.正则表达式的定义2.创建正则表达式3.匹配常用字符4.常......
  • VBA中的基础知识:类型判别及定义
    变量类型 用TypeName()函数可以判断变量类型。TypeName(i)="Single"就是单精度浮点数TypeName(i)="String"就是字符串 另外IsNumeric判断变量的值是否为数值isdate判断变量的值是否为日期isnull判断变量的值是否包含任何有效数据isempty判断变量的值是否为空......