一种类型的树贪心

news/2024/10/22 20:23:23

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)\)

代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/74786.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

java的三大程序结构

JAVA的三大程序结构 一:顺序结构 程序走上执行到下。 二:选择结构 if单选择结构 if(布尔表达式){ //如果布尔表达式的值为ture则执行{}里的语句块 } public class IfDemo01 {public static void main(String[] args) {//接收键盘输入Scanner scanner = new Scanner(System.…

CSP模拟赛 #42

#40 懒得写了,#41 题目质量过低。A 有 \(n\) 张长度为 \(m\) 的纸条,每张纸条有 \(k_i\) 个位置有小写字母,其他位置透明。你需要合理从上到下排列这些纸条,使得最终在上方看到的字符串为 \(s\),保证对于每个位置,至少一张纸条在该位置有一个字母。给出方案或无解。 \(1\…

markdown转pdf,方法总结

总结使用1. VScode插件Markdown Preview Enhanced。格式是正确的。但是无法批处理和指令处理2. pandoc --pdf-engine=typst。无法导出粗体和斜体需求 markdown格式转为pdf我遇到的: 1. 我现在想把多个八股文文档(GitHub项目里的 scutan90/DeepLearning-500-questions: 深度学…

苦寻多日,终于搞定了地形切片,向大家安利一下这款超简单的免费GIS工具箱

概述 地形切片是将大范围的地形数据分割成小块(切片)进行存储和展示的技术,常用于高效的三维地形可视化和动态加载。在实际操作中,可以通过GISBox等工具进行地形切片处理。今天和大家安利的GISBox 是一个用于GIS模型切片、服务分发的免费GIS工具箱,其中包括了支持地形切片…

历届 CSP 刷题记录

\(\texttt{CSP 2019}\) J 组 \(\texttt{T3}\) 题目传送门 注意到一点:每天卖出纪念品换回的金币可以立即用于购买纪念品,当日购买的纪念品也可以当日卖出换回金币。当然,一直持有纪念品也是可以的。 这告诉我们:在一天内,纪念品就是钱,钱就是纪念品,钱和纪念品没有本质区…

Nacos K8s

Nacos 是 Dynamic Naming and Configuration Service 的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 是构建以服务为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。更多的功能特性介绍请查看 Nacos 概览。 在本文…

RocketMQ - 总结

1. 为什么要使用MQ,使用场景是什么异步 : 减少请求响应时间,实现非核心流程异步化 (架构设计原则,能异步就不要同步) 解耦:屏蔽异构平台的细节,生产者消费者可自行扩展修改系统能力只需遵循消息约束,生产者消费者不受对方影响 流量削峰:消息堆积能力,消息保存在MQ中,…

数据采集作业一

一、用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020)的数据,屏幕打印爬取的大学排名信息点击查看代码 # 目标网址 url = "http://www.shanghairanking.cn/rankings/bcur/2020"# 获取网页内容 response = url…