树上一些点的选 题解

news/2025/1/15 16:16:00/文章来源:https://www.cnblogs.com/XuYueming/p/18406332

题意简述

给你一棵 \(n\) 个节点以 \(1\) 为根的有根树,和一个整数 \(m\)

对于树上每一个点 \(u\),有三个权值 \(X, Y, Z\)。你需要在 \(u\) 的祖先里(不含 \(u\))中选出至少 \(X\) 个点,记 \(S_1\) 表示这些点到 \(u\) 的距离之和;在 \(u\) 的后代里(不含 \(u\))中选出至少 \(Y\) 个点,记 \(S_2\) 表示这些点到 \(u\) 的距离之和。选出的点数应恰好等于 \(m\)。对于每一个点,求 \(\min \vert S_1 - S_2 + Z \vert\)。如果没有合法的选点方案,输出 \(-1\)

题目分析

这个距离和不喜欢,拆掉。

为方便叙述,记祖先中选出点集为 \(U\)\(x = \vert U \vert\),同理记后代中选出点集为 \(D\)\(y = \vert D \vert\)。那么:

\[\begin{aligned} S_1 &= \sum _ {v \in U} \operatorname{dis}(v, u) \\&= \sum _ {v \in U} \operatorname{dpt}(u) - \operatorname{dpt}(v) \\&= x \operatorname{dpt}(u) - \sum _ {v \in U} \operatorname{dpt}(v) \\ \end{aligned} \]

同理 \(S_2 = -y \operatorname{dpt}(u) + \sum \limits _ {v \in D} \operatorname{dpt}(v)\),那么所求值即为:

\[\begin{aligned} & \quad \ \min \left \vert \left (x \operatorname{dpt}(u) - \sum _ {v \in U} \operatorname{dpt}(v) \right ) - \left (-y \operatorname{dpt}(u) + \sum \limits _ {v \in D} \operatorname{dpt}(v) \right ) + Z \right \vert \\ &= \min \left \vert x \operatorname{dpt}(u) - \left ( \sum _ {v \in U} \operatorname{dpt}(v) \right ) + y \operatorname{dpt}(u) - \left ( \sum \limits _ {v \in D} \operatorname{dpt}(v) \right ) + Z \right \vert \\ &= \min \left \vert (x + y) \operatorname{dpt}(u) + Z - \left ( \sum _ {v \in U} \operatorname{dpt}(v) + \sum \limits _ {v \in D} \operatorname{dpt}(v) \right ) \right \vert \\ \end{aligned} \]

发现 \(x + y\) 为一定值 \(m\),故而所求值即为两个 \(\sum\) 与一定值的最少差值绝对值,也就是尽量靠近那个定值。这就来到了此题难点所在。

一个很神的想法是去证明,这两个 \(\sum\) 的和的取值范围为一段连续区间,再扣掉常数个点,这样一个东西。

证明:

显然其有最值。从其取最大值的选点方案,往最小值调整。初始时所有点聚集在下方,取到最大值。

每次我们可以取一个 \(u\),如果 \(\operatorname{fa}(u)\) 没被选,我们就可以让 \(u \gets \operatorname{fa}(u)\),则 \(\operatorname{dpt}(u) \gets \operatorname{dpt}(u) - 1\),就将和往下调整了 \(1\)

我们还可以让 \(u\) 的一个孩子 \(u\),越过 \(u\),走到 \(\operatorname{fa}(u)\)。但是这样导致将和往下调整了 \(2\)。注意到,我们可以选取另一个点,向下走一步来抵消。如果找不到这一个用来抵消的点,我们的取值范围就被挖去了这一个点。

找不到这样的点,当且仅当所有点都不存在一个没被选择和孩子。情况数不多,大力分讨调整了 \(2\) 后的情形:

  1. 上方满了,下方为空。
  2. 上方满了,下方全聚集在底部。
  3. 上方只有移动的点,下方为空。
  4. 上方只有移动的点,下方全聚集在底部。

这些局面的 \(\sum + \sum - 1\) 是不能取到的。

那么,我们只需要求出这两个 \(\sum\) 的上下界即可。

对于深度之和的下界,就是尽可能多的点在 \(u\) 的祖先。说明此时有 \(x = x_{\max}\) 个点,深度分别为 \(1, \ldots, x_{\max}\)\(\operatorname{dpt}(1) = 1\));剩下下方 \(y = m - x_{\max}\) 个点,尽可能靠上贴在 \(u\) 下方。

对于深度之和的上界,同理,尽可能地靠下。上方有 \(x = x_{\min}\) 个点,深度为 \(\operatorname{dpt}(u) - x_{\min}, \ldots, \operatorname{dpt}(u) - 1\);下方 \(y = m - x_{\min}\) 个点,尽可能靠下。

\(x_{\min}, x_{\max}\) 是简单的。

\[\left\{\begin{matrix} X \leq x \leq \operatorname{dpt}(u) - 1 \\ Y \leq m - x \leq \operatorname{siz}(u) - 1 \end{matrix}\right. \Rightarrow \max \Big \{ X, m - \operatorname{siz}(u) + 1 \Big \} \leq x \leq \min \Big \{ \operatorname{dpt}(u) - 1, m - Y \Big \} \]

对于 \(1 \sim u\) 这条链上的答案很好统计,关键在于子树内,选出 \(k\) 个点,尽可能靠上 / 靠下的深度和。直接上线段树合并维护子树每个深度出现次数,加上前 / 后 \(k\) 大值的和查询。或者树上启发式合并,树状数组上二分。

前者是 \(\Theta(n \log n)\) 的。

代码


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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

作业9.2:论文查重

这个作业属于哪个课程 班级链接这个作业要求在哪里 作业要求链接这个作业的目标 设计论文查重算法;学会 Git 版本控制。Github 链接:博客正文首行 github 链接 目录一、整体设计开发环境整体设计项目结构二、模块接口的设计与实现核心的类与方法类与函数的调用关系核心算法三…

搭建企业内部的大语言模型系统

大纲开源大语言模型 大语言模型管理 私有大语言模型服务部署方案开源大语言模型 担心安全与隐私?可私有部署的开源大模型商业大模型,不支持私有部署ChatGPT Claude Google Gemini 百度问心一言开源大模型,支持私有部署Mistral Meta Llama ChatGLM 阿里通义千问常用开源大模型…

115. 不同的子序列(leetcode)

https://leetcode.cn/problems/distinct-subsequences/submissions/563375885/ 这题比较有难度,具体不太好想到,需要以是否选择s[i]来划分子集这位描述的很清楚,不做过多赘述 class Solution {public int numDistinct(String s, String t) {// f[i][j]表示s中前i个字符中选择,有…

0.1+0.2 != 0.3 (Java为例)

1. 小数的二进制表示 以10.625为例。整数部分进行除2取余的操作,10的二进制为1010。小数部分进行乘2取整操作,直到小数部分为0或达到需要的精度:0.625*2=1.25 取整数1,小数部分0.25继续计算 0.25*2=0.5 取整数0,小数部分0.5继续计算 0.5*2=1.0 取整数1,小数部分为0,停止…

信创领域认证,来自工信部人才交流中心的PostgreSQL培训班

在国家大力发展信创软件和数据库行业的背景下,PostgreSQL 具有多方面的优势和机遇,具体体现在以下几个方面: 1. 技术优势契合信创需求: PostgreSQL 数据库是一个功能强大、性能稳定、可扩展性强的开源对象关系数据库系统,支持多种数据类型(如数组、JSON、XML 等),方便存储…

Salesforce职业规划:原厂,甲方,乙方,从业者应该如何选择?

Salesforce生态系统蓬勃发展,对不同角色的需求量不断增加。需求方包括使用Salesforce的最终用户(甲方)、实施Salesforce的咨询公司、为Salesforce创建应用程序的AppExchange公司(或ISV),当然还有Salesforce原厂。 Salesforce最终用户(甲方) 2020年,Salesforce的客户数…

3SRB5016-ASEMI三相整流桥3SRB5016

3SRB5016-ASEMI三相整流桥3SRB5016编辑:ll 3SRB5016-ASEMI三相整流桥3SRB5016 型号:3SRB5016 品牌:ASEMI 封装:3SRB-5 批号:2024+ 现货:50000+ 最大重复峰值反向电压:1600V 最大正向平均整流电流(Vdss):50A 功率(Pd):大功率 芯片个数:5 引脚数量:5 安装方式:直插 类…

34-样式迁移

类似于加了一层滤镜基于CNN的样式迁移:如下对于合成图片X,我们希望它的内容和输入的内容图片,放入同一个CNN,在某一个卷积层上,输出的与内容有关的特征能够匹配 同时,,对于样式图片,我们希望合成图片X,和样式图片放入同一个CNN,在某一个卷积层上,输出的与样式有关的…

STM32-ADC外设

1.通道 .规则通道 .注入通道 2.规则序列寄存器 配置通道的采样顺序 3.ADC周期4.ADC转换方式 *单次转换:adc每次只采集某个通道的一个点,如果需要再次采集,就需要重新使能。 *连续转换:adc采集某个通道一个点,转换完成后,再采集第二点。依次类推 4.扫描模式 *单次扫描模式…

SignalR跨域问题解决

本文来自博客园,作者:WantRemake,转载请注明原文链接:https://www.cnblogs.com/SmallChen/p/18406437

字符串类

常用类String基础知识String类的特性String类是一个final类,不能被继承 String类底层是一个final修饰的字符数组,表示不可变的字符序列(final char value[ ]) String的不可变性:当String值改变时,会在常量池中创建新的字符串字符串-创建字面量方式创建 String s1="a…

AI答案之书解来为你解决难题

本文由 ChatMoney团队出品介绍说明 “答案之书智能体”是您贴心的智慧伙伴,随时准备为您解答生活中的种种困惑。无论您在工作中遭遇瓶颈,还是在情感世界里迷失方向,亦或是对个人成长感到迷茫,它都能倾听您的心声,并给予准确且富有启发的回应。 它并非简单地给出答案,而是…