B [yLOI2019] 梅深不见冬

Background

风,吹起梅岭的深冬;霜,如惊涛一样汹涌;雪,飘落后把所有烧成空,

像这场,捕捉不到的梦。

醒来时已是多年之久,宫门铜环才长了铁锈,

也开始生出离愁。

——银临《梅深不见冬》

Description

给定一棵 \(n\) 个节点的树,在树上行走,每次要么选择一个没有到达过的子节点,要么返回父节点。想要在一个节点 \(u\) 放上梅花当且仅当 \(u\) 的任意子节点 \(v\) 都被放上了 \(w_v\) 朵梅花。在任意时刻可以收回任意节点的梅花。对于每个节点,求如果想在这个节点放梅花,则至少需要准备多少梅花。

Limitations

特殊性质1:每个节点的孩子结点个数不超过 \(2\)

特殊性质2:每个节点的孩子节点个数不超过 \(5\)

特殊性质3:任意一个节点到根的路径上的点数不超过 \(3\),也即树高不超过 \(3\)

对于 \(100\%\) 的数据,保证 \(1 \leq w_i \leq 1000\)

Solution

测试点 \(1\):

只有一个节点,输出 \(w_1\) 即可。期望得分 \(5~pts\)

测试点 \(2~\sim 5\):

爆搜一个行走的顺序,然后可以 \(O(n)\) 判断是否合法。时间复杂度 \(O(n!\times n)\),期望得分 \(20~pts\)

测试点 \(6~\sim~7\):

注意到题目所规定的走法相当于按照树的某个dfs序走,即离开某个节点时必须遍历完它的子树,否则子树中一旦有一个节点没有被遍历到,则永远无法返回这个节点。

如果设在点 \(u\) 上放上 \(w_u\) 朵梅花最少需要 \(ans_u\) 朵梅花的话,考虑对于 \(u\) 的两个孩子 \(x,~y\),如果先走 \(x\),那么首先需要准备 \(ans_x\) 朵梅花,放上了 \(w_x\) 朵梅花,剩余了 \(ans_x - w_x\) 朵花,再走 \(y\),需要准备 \(ans_y\) 朵花,当前有 \(ans_x - w_x\),则需要额外准备 \(\max(ans_y - ans_x + w_x, 0)\) 朵花。先走 \(y\) 的情况类似,比较一下哪种情况更优即可。

时间复杂度 \(O(n)\),期望得分 \(10~pts\)

测试点 \(8~\sim 10\):

孩子节点个数不超过 \(5\),于是爆搜一下走哪个孩子的顺序,用类似子任务 \(3\) 的方法统计,然后取最优的即可。

时间复杂度 \(O(n \times x!)\),其中 \(x\) 为最大的节点孩子个数。期望得分 \(15~pts\)

测试点 \(11~\sim 14\):

树高不超过 \(3\),考虑第 \(3\) 层的节点,答案显然是他们自身的权值,第二层的节点,答案是第三层的权值和。

对于第一层的根节点 \(u\),考虑放满他的孩子的花费和在这个节点上放梅花的花费的关系:

如果放满它的孩子花费为 \(c\),它的孩子的权值和为 \(W\),则会剩余 \(rest = c - W\) 朵梅花,由于 \(W\) 是个常量,\(rest\) 与 \(c\) 正相关。考虑当 \(w_u > rest\) 时,需要额外花费 \(w_u - rest\) 元,花费为 \(w_u - rest + rest = w_u\) 元,当 \(w_u \leq rest\) 时,花费 \(rest\) 元。由此可以发现,当 \(rest\) 减小时,所需要的花费不会增大。又因为 \(rest\) 与 \(c\) 正相关,因此放满它的孩子的花费变地,在这个节点上放梅花的花费不会增加。因此最小化放满它孩子的花费即可得到答案。

对于一个节点 \(x\),设往这个节点上放上梅花至少需要准备 \(ans_x\) 朵梅花,而 \(x\) 的权值为 \(w_x\),我们的问题是选择一个最优的放梅花的序列,使得最终需要准备的梅花最小。这个问题的答案是按照 \(ans_x - w_x\) 的不升序排序即可。

考虑证明这个结论:

设有两个节点 \(i,~j\),设 \(a_i = ans_i - w_i,~a_j = ans_j - w_j\) 且 \(a_i > a_j\)。

考虑先放 \(i\) 再放 \(j\) 需要准备的梅花朵数是 \(\max(ans_i, ans_j + w_i)\)(一式),同理先放 \(j\) 所需要准备的梅花朵数是 \(\max(ans_j, ans_i + w_j)\)(二式)。

由于 \(a_i = ans_i - w_i\),得 \(ans_i = a_i + w_i\)。\(ans_j\) 同理。对一式二式分别提出 \(w\)。

\[\text{一式} = \max(ans_i, ans_j + w_i) = \max(a_i + w_i, ans_j + w_i) = w_i + \max(a_i, ans_j)\]

\[\text{二式} = \max(ans_j,ans_i + w_j) = w_j + \max(a_j, ans_i) = w_j + \max(a_j, a_i + w_i) = w_j + a_i + w_i\]

考虑一式的 \(\max\) 如果取 \(a_i\),那么 \(\text{一式} = w_i + a_i < w_i + a_i + w_j = \text{二式}\)

如果取 \(ans_j\),那么 \(\text{一式} = w_i + w_j + a_j < w_i + w_j + w_i = \text{二式}\)

因此,一式恒小于二式,先放 \(i\) 更优。

据此做数学归纳可得,按照 \(ans - w\) 的不升序排序后的序列是最优的。

于是即可排序以后用上面的方式统计答案,时间复杂度 \(O(n \log n)\),期望得分 \(20~pts\)

测试点 \(15~\sim 20\):

发现上面的结论可以应用于这棵树上的任何一个节点,于是每个节点都按照这样的方法排序即可。时间复杂度 \(O(n \log n)\),期望得分 \(30 pts\)。

【贪心】【P5521】[yLOI2019] 梅深不见冬的更多相关文章

  1. Vijos P1023Victoria的舞会3【贪心+DFS求强联通分量】

    链接:Click Me! P1023Victoria的舞会3 Accepted 标签:Victoria的舞会[显示标签] 描写叙述 Victoria是一位颇有成就的艺术家,他因油画作品<我爱北京 ...

  2. 【POJ - 1862】Stripies (贪心)

    Stripies 直接上中文了 Descriptions 我们的化学生物学家发明了一种新的叫stripies非常神奇的生命.该stripies是透明的无定形变形虫似的生物,生活在果冻状的营养培养基平板 ...

  3. [C++]单源最短路径:迪杰斯特拉(Dijkstra)算法(贪心算法)

    1 Dijkstra算法 1.1 算法基本信息 解决问题/提出背景 单源最短路径(在带权有向图中,求从某顶点到其余各顶点的最短路径) 算法思想 贪心算法 按路径长度递增的次序,依次产生最短路径的算法 ...

  4. [C++]多源最短路径(带权有向图):【Floyd算法(动态规划法)】 VS n*Dijkstra算法(贪心算法)

    1 Floyd算法 1.1 解决问题/提出背景 多源最短路径(带权有向图中,求每一对顶点之间的最短路径) 方案一:弗洛伊德(Floyd算法)算法 算法思想:动态规划法 时间复杂度:O(n^3) 形式上 ...

  5. leetcode刷题-- 4. 贪心

    贪心 455分发饼干 假设你是一位很棒的家长,想要给你的孩子们一些小饼干.但是,每个孩子最多只能给一块饼干.对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸:并且每块饼 ...

  6. SharePoint 2013管理中心里【管理服务器上的服务】不见了

    打开管理中心,准备配置Managed Metadata Service,发现"管理服务器上的服务"不见了 那我自己拼url直接访问:http://xxxx/_admin/Serve ...

  7. BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1383  Solved: 582[Submit][St ...

  8. Hive安装(二)之表不见了

    重启一下电脑,发现表不见了,原来我用的derby存储hive的meta,网上找了一下资料,说是要用mysql, 于是安装mysql   sudo apt-get install mysql-serve ...

  9. HDOJ 1051. Wooden Sticks 贪心 结构体排序

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

随机推荐

  1. 基于 HTML5 换热站可视化应用

    换热站是整个热网系统中最核心的环节,它将一侧蒸汽或高温水通过热交换器换成可以直接进入用户末端的采暖热水.换热站控制系统是集中供热监控系统的核心部分,换热站控制系统既可独立工作,也可以接受调度中心的监督 ...

  2. 前端学习:JS学习总结(图解)

    前端学习:JS学习总结(图解) JS的代码笔记 JS比HTML和CSS的知识点要多的多,下面分几段来介绍其内容... 为了能让大家更好的检索,前面的图解是整个JS的概括,后面的才是知识点... 旁边就 ...

  3. 解密“CDO-首席数据官”的价值、挑战及发展

    数据,不论形态.格式和类型,已经迅速成为企业最有战略意义的资产:数据资产已经成为了可以形成业务洞察及优势的战略资源,数据的体量.多样性和复杂性也正以指数级增长.就像其他重要的企业资产,数据需要适当的管 ...

  4. 「vue基础」一篇浅显易懂的 Vue 路由使用指南( Vue Router 下)

    大家好,在上一篇系列文章里,我们一起学习了路由的基本配置,如何创建路由和传参,本篇文章我们一起学习下 Navigation 导航和路由守卫的相关内容. Navigation 如果要改变当前路径,我们可 ...

  5. Kafka学习笔记之K8S内filebeat传输到kafka报错带解决方案

    0x00 概述 filebeat非常轻量级,正常情况下占用的资源几乎都能忽略不计,但是部署后发现资源占用很大,所以怀疑是filebeat本身出了问题. 第一时间查看filebeat日志(默认路径/va ...

  6. ******可用 SpringBoot 项目打包分开lib,配置和资源文件

    spring-boot多模块打包后,无法找到其他模块中的类https://blog.csdn.net/Can96/article/details/96172172 关于SpringBoot项目打包没有 ...

  7. node、npm、gulp安装

    1.先安装node.js ,官网下载地址:https://nodejs.org/en/ 2.安装完node之后,npm自动就安装了.可以直接在visual studio code 通过命令查看 nod ...

  8. sql 按指定规则排序,例如 按 1,3,2排序 而不是1,2,3

    我们都知道 sql语句中的排序有desc(降序).asc(升序),这两个都是按顺序排列的,最近有一个需求是不按顺序排序了 ,抽出个别的排在前面,并且这种需求是应对的问题中的数据是比较少的,而且没有规律 ...

  9. MailKit/MimeKit 发送邮件

    MimeKit / MailKit 支持最新的国际化的电子邮件标准,是.NET 中为一个支持完整支持这些标准电子邮件库,最近正式发布了1.0版本.如果你想做所有与的电子邮件相关的事情,看看 MimeK ...

  10. GIT篇章(二)

    如何多人协同开发同一个项目? 使用代码版本控制[version control]软件, 目前市面上比较流行的代码版本控制器有: git,svn,csv 1. 使用git管理代码版本 本项目使用git管 ...