虚树 Virtual Tree

news/2025/1/8 16:07:39/文章来源:https://www.cnblogs.com/HarlemBlog/p/18657471
更新日志 2025/01/07:开工。

概念

在很多树上问题中,我们会发现,实际需要的,只有几个关键点。

那么我们就可以针对这些关键点进行操作。更具体地,建一棵规模更小的,但是仍能完成要求的浓缩过的树,即为虚树

思路

简介

首先,常识可得:除了关键点,关键点两两的 \(\text{LCA}\) 也需要储存重要信息。

所以建立虚树的关键问题就是:找 \(\text{LCA}\)、按原关系建树。

下面介绍两种构造方案。

二次排序

\(O(m\log n)\)\(m\) 为关键点数。

大概过程就是:

  • 关键点按 \(\text{DFS}\) 序排序。
  • 相邻两点求出 \(\text{LCA}\),加入序列。完成后去重,序列中的节点就是虚树中的节点了。
  • 对于每两个相邻点 \(x,y\),连接 \(\mathrm{LCA}(x,y)\)\(y\)

下面证明第二和第三过程。

首先,可以想象,按 \(DFS\) 序排序后,相邻的节点要么是祖先关系、要么是兄弟关系(很废话),且从左向右排开。假如二者跨了子树——总会有这样的点——就会把两棵子树的父节点加入,而它也是任意左子树点和任意右子树点的 \(LCA\)。感性理解即可。

然后,我们分讨一下第三过程:

  • \(x,y\) 为祖先关系,那么直接连边显然无问题,且二者之间没有别的关键点了。
  • \(x,y\) 非祖先关系,\(\text{LCA}(x,y)\) 显然也应该是 \(y\) 的祖先。且二者之间显然也没有别的关键点了,因为 \(x,y\)\(\text{DFS}\) 序上相邻。可以大概想象一下。
  • 发现第一个点没有连边,但是作为 \(\text{DFS}\) 序最小的,它必然是根节点,所以无需主动连边。

证毕。不难发现虚点个数为实点个数两倍。

单调栈

类似于笛卡尔树之类的,我们考虑维护虚树上的一条链。

首先,我们把原根节点加入进去,确保正确性。

我们考虑加入一个节点的情况:

  • 若栈顶节点是新加入节点的祖先,直接入栈。
  • 否则:
    • 若栈顶元素 \(\text{DFS}\) 序大于 \(\text{LCA}\),说明它是当前节点的一个兄弟节点:
      • 若次大元素仍大于 \(\text{LCA}\),将栈顶元素与次大元素连边,弹出。
      • 否则,说明当前栈顶元素的父节点应为 \(\text{LCA}\),连边,弹出。
    • 若栈顶元素 \(\text{DFS}\) 序小于 \(\text{LCA}\),说明此时 \(\text{LCA}\) 还没入栈,将其加入后,再把当前节点加入即可。

最后剩下的链里的节点依次连边,虚树就构建好了。

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

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

相关文章

让跨 project 联查更轻松,SLS StoreView 查询和分析实践

在业务场景中,日志数据可能存储在日志服务 Project 的不同 Logstore/MetricStore 中或不同地域的 Project 中。日志服务的数据集(StoreView)功能支持跨地域、跨 Store 联合查询和分析,让用户基于数据集就能高效便捷地查询分析全地域的数据,真正做到数据分析不受地域边界的…

流程配置中心同步后流程版本ID不一致

不同的账套进行流程发布时会产生不同的版本ID , BOS同步后的流程设计的ID是相同的.

大语言模型提示技巧(六)-文本转换

大语言模型是基于自然语言的人工智能,所以它在语言上的表现相当出色,使用大语言模型进行可以进行诸如翻译、语气转换、润色、语言评价、扩写、润色等语言处理,对于日常文字工作,它是一名合格甚至优秀的私人秘书。 (一)翻译 在不同语言之间进行翻译是众多大语言模型都支持…

Unreal Engine 5 课程记录 蓝图部分(非教程)

学习课程:Unreal Engine 5 – Full Course for Beginners 非教程,仅学习记录及碎碎念,学完感觉UE就非常的像预制菜,简简单单就能有非常好的效果(非常に新鲜で、非常に美味しい!),但装料太足了要想拆分明白用料和流程又会比较复杂!Creating Levels 创建基本关卡,几个组…

Unreal Engine 5 课程笔记 蓝图部分

学习课程:Unreal Engine 5 – Full Course for Beginners 非教程,仅学习记录及碎碎念,学完感觉UE就非常的像预制菜,简简单单就能有非常好的效果(非常に新鲜で、非常に美味しい!),但装料太足了要想拆分明白用料和流程又会比较复杂!Creating Levels 创建基本关卡,几个组…

通过修改格式灵活运用百度搜索

1、“+”加号 —— 强制包含关键词 在关键词的前面使用加号,也就等于告诉搜索引擎该单词必须出现在搜索结果中的网页上。 例如:在搜索引擎中输入“+电脑+电话+传真”就表示要查找的内容必须要同时包含“电脑、电话、传真”这三个关键词。 2、“-”非——消除无关性 逻辑“非”…

Arm主板与x86主板的区别

在当今数字化迅猛发展的时代,计算机硬件的架构选择对于系统的性能、能效以及适用性具有至关重要的影响。Arm架构与x86架构是目前主流的两种计算机体系结构,各自在个人计算机、服务器、嵌入式系统及移动设备等领域中占据了重要地位。本文旨在探讨Arm主板与x86主板之间的区别,…

E. Beautiful Array(题解)

原题链接: https://codeforces.com/problemset/problem/1986/E 思路: 排序,取模, 思维 关于操作:ai=ai+k; 若要使a1+m1*k==a2+m2*k; 则当a1, a2满足a1%k==a2%k,a1,a2可以满足a1+m1*k==a2+m2*k;并在需要(|a1-a2|)/k次操作。将a数组取模后,用vector分别储存, a1和a2相差越…

Python语言中进程、线程、协程执行效率分析

python语言中进程、线程、协程执行效率比较。 问题:python语言中 进程、线程、协程执行速度哪个最快? 在Python中,进程、线程和协程的执行速度不能简单地进行比较,因为它们的性能取决于多种因素,包括任务类型、I/O操作、CPU密集型计算、操作系统调度策略以及Python解释器的…

CICD Day4、Jenkins主从架构

Jenkins主从架构(Master-Slave)是一种分布式架构,主节点负责管理项目配置、任务调度和监控,从节点用于执行具体的构建任务。Jenkins主从架构如下图所示当项目触发构建时,主节点将任务分配到某个从节点,从节点根据项目配置执行一系列操作,如拉取代、代码编译、部署到目标…

如何进一步做好信息收集

如何进一步做好信息收集 前言 前面一节介绍了一些信息收集的网站和工具,今天主要介绍一下如何进行半自动化的信息收集,全自动化的信息收集容易出现一些脏数据,而完全手工进行信息收集速率又太低,所以为了提高速率,我们需要充分利用一些脚本和工具 WHOIS半自动化收集 通过W…

链路诊断最佳实践:1 分钟定位错慢根因

面向生产应用“错”、“慢”两大风险,通过链路追踪及其关联数据、跨域实体关系和大模型算法,实现错慢请求智能根因定位,提升系统稳定性和运维效率。线上应用风险主要分为“错”、“慢”两大类。其中“错”的原因通常是程序运行不符合预期,比如 JVM 加载了错误版本的类实例,…