当前位置: 首页 > news >正文

边分树学习笔记

熟悉了云和闪电的脾气,就不再迷惑。

主体介绍

边分树是个针对边分治的扩展算法,和点分治到点分树类似的,我们试图把边变成点并连接起来得到一颗新的树。此时这棵树可以描述一个点在边分治过程中的所属连通块。

具体操作

我们把边变成点,根据边分治的过程,连接起来得到一颗新的二叉树。可以拟定一条边节点大的那一个联通块中的切割边节点在左子树,当然,拟定在右子树也是可以的。

由于一个边可以原来的连通块划分两个连通块,因此在一次划分之后,原来连通块中的点将被分配到链两边的联通块的其中之一(如图一)。


图一(红色边表示被切割的边,数字表示每个点所在的连通块)

这个时候继续寻找要切开的边,就变成了在两个连通块中独立寻找,也仅和所属连通块中的点有关系。因此,我们可以根据一个点在每次边被切割后的所属连通块来为这一个点构造一个整体边分树的从根到叶子的链。

举个例子,比如对于一个点,假设它在第一次切割中被分配到了整体边分树中左子树边所在的连通块,那么此时在这个点的边分树链里,我们就把右边子树给舍弃了,这是类似动态开点线段树的(如图二)。


图二(红色表示在那个点单独的链上)

不难发现,实际上这条链描述了这个点在每次切割后的归属。利用这一点,我们就可以得到一个结论:对于两个原树上的节点,他们边分树链中深度最深的边将这两个点切成了不同的连通块中的点。

对于每个点,我们可以储存它们在边分树过程中到各个连通块根的信息和。而边分树链上的一个点,正好描述了一个切割后两个连通块各有各的根的样子。因此我们可以将这个边分树上的每个点储存该节点在这个状态的时候,到达根的信息和。由于边分治的性质,这些信息总量是 \(O(n\log n)\) 的,而且我们可以直接暴力在每次切割后计算,不会消耗额外的时间,也就是说,这需要花费 \(O(n\log n)\) 的时间,而空间同样也是 \(O(n\log n)\) 的。

这个时候,我们就把边分治的过程给描述了,所以我们就可以支持一些更加不顺序的询问,在这一点上,它和点分树可能是类似的。

比如,我们可以使用这个数据结构在线地 \(O(\log n)\) 每次地回答两个点之间的距离。这是原来的边分治所做不到的,他需要离线。

例题

[CTSC2018] 暴力写挂

有对答案式子的变换:

\[\begin{aligned} &\max\{\text{depth}(x)+\text{depth}(x)-\text{depth}_{\text{LCA}(x,y)}-\text{depth}'_{\text{LCA}'(x,y)}\}\\ =&\frac{1}{2}\max\{\text{dist}(x,y)+\text{depth}(x)+\text{depth}(y)-2\text{depth}'_{\text{LCA}'(x,y)}\} \end{aligned} \]

因此考虑边分治,在一次分割中,如果我们将到当前连通块的根的距离加上原树深度作为 \(val(x)\),那么此时答案就是 \(val(x)+val(y)+w(e)-2\text{depth}'_{\text{LCA}'(x,y)}\),其中 \(x,y\) 在两个不同的连通块里面。

此时计算 \(2\text{depth}'_{\text{LCA}'(x,y)}\) 变成了难点,一个做法是对于 \(T_2\) 建出虚树,直接枚举 \(\text{LCA}'(x,y)\),然而这是 \(O(n\log^2 n)\) 的,难以通过。

我们考察建虚树的目的实际上是不能够直接枚举 \(T_2\)\(\text{LCA}'\),因为点分治是离线的,因为它给出的数据是离线获取的,因此我们不可以在线地在边分治中询问用来迎合枚举 \(\text{LCA}'\) 所需要的在线。

因此考虑描述了边分治过程的边分树,它可以支持在线的询问。

因此我们可以做这样一件事情,在单点的边分树链的节点维护 \(val\) 信息。然后在 \(T_2\) 上枚举 \(\text{LCA}'\),此时对于一个枚举的点,\(x,y\) 分别位于不同的子树中,因此我们需要维护每颗子树的边分树(在一开始,叶子的边分树就是它的边分树链)。这个时候我们同时做合并和对答案贡献的过程,具体来说是,我们维护前 \(k\) 个子树的边分树,此时考虑 \(k+1\) 颗子树的边分树,我们对于每个两个边分树都有的节点,对于答案更新 \(val(lson_u)+w(e)+val(rson_v)-2\text{depth}'_{rt}\)\(val(rson_u)+w(e)+val(lson_v)-2\text{depth}'_{rt}\)(如果没有左或者右节点就不管)然后,在合并后的树上将该节点的 \(val\) 设置为 \(\max(val(u),val(v))\)

最后别忘了考虑单点的情况,它并没有被点分治或者说是点分树考虑到,以及答案需要除以二。

http://www.jsqmd.com/news/683981/

相关文章:

  • wangEditor在Vue项目中的两个大坑:动态渲染与表单回填的完整解决方案
  • Agenus 指定 BAP Pharma 为 BOT+BAL 准入项目全球独家合作伙伴
  • React 任务过期逻辑:调度器中的 expirationTime 是如何防止低优先级任务产生“饥饿(Starvation)”现象的?
  • 广州搬家避坑指南:干了20年的李班长教你选对公司、搬得省心 - 广州搬家老班长
  • RAPIDS 24.10版本GPU加速与大数据处理实战解析
  • C语言完美演绎8-15
  • 告别Unity/UE4焦虑!用Love2D+Lua零基础开启你的第一个游戏项目(附ZeroBrane Studio配置避坑指南)
  • 4/22
  • PIC32MX795F512LT-80I/PT以及PIC32MX795F512L-80I/PT是一款32 位高性能微控制器
  • 内网日志排查小工具:纯 HTML 单文件,超大日志秒开 + 全局搜索
  • Phi-3.5-mini-instruct部署案例:为高校实验室定制代码辅导AI工具
  • 美国国安局无视供应链风险继续使用Anthropic公司Claude Mythos模型
  • 牛客:最长不下降子序列
  • Less如何优化CSS文件大小_利用压缩配置去除冗余样式
  • 2026年3月招牌美食品牌口碑推荐,江湖菜/招牌江湖菜/辣子鸡/当地美食/必吃美食/麻辣鱼/特色美食,招牌美食品牌怎么选 - 品牌推荐师
  • 2026年小红书被朱雀AIGC检测?去i迹+嘎嘎降3步降到15% - 我要发一区
  • 线程调优详解
  • 日志吞吐暴跌60%?Docker默认json-file驱动正在悄悄拖垮你的K8s集群,立即检查这3个隐藏参数!
  • nli-MiniLM2-L6-H768快速部署:Ubuntu/CentOS/Windows三平台适配教程
  • GitHub评论可触发Claude Code、Gemini CLI和GitHub Copilot的提示注入漏洞
  • 如何将视频从 iPhone 传输到电脑
  • 如何用 createObjectStore 创建一个类似表结构的存储空间
  • OpenCV逻辑回归实现与参数调优指南
  • Git工作流程与常用指令——从本地开发到远程协作
  • Vim编辑器介绍与使用
  • D3keyHelper:暗黑3高效自动化解决方案与智能宏架构解析
  • 40G ZR4光模块:长距互联的优选方案
  • 广州搬家避坑指南:收费透明、单位搬迁全攻略,听20年老兵怎么说 - 广州搬家老班长
  • Unity 2018.4.12下Magica Cloth插件完整配置流程:从导入依赖包到裙子骨骼布料实战
  • RadiantViewer64bit试用期重置技巧:30天后如何继续免费使用(附详细步骤)