Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/AMS-Regular.js

长链剖分总结

长链剖分总结

概念

长链剖分和轻重链剖分十分相似,都是将一棵树节点的信息分成多条链的信息,但是前者是以深度剖分,后者则是以子树大小来剖分。

同时长链剖分还借鉴了dsuontreedsuontree的一些tricktrick使得它能十分高效地合并子树信息。

性质

破天荒地写了证明

性质一

所有链长度之和为节点数

证明:

  • 每个点在且仅在一条链中

性质二

任意一个点kk级祖先所在长链的长度一定大于等于kk

证明:

  • 假如yy所在长链的长度小于kk,那么它所在的链一定不是重链,因为xyxy这条链显然更优,那么yy所在的重链长度至少为kk,性质成立。否则 yy 所以在长链长度大于等于 kk ,性质成立。

性质三

任意一个点跳重链到根所用的次数不超过nn

证明:

  • 根据性质二,如果一个点从当前链跳到另一条链上,另一条链的长度大于当前链的长度
  • 那么最坏情况为链长分别为1,2,3...n1,2,3...nnn

一些trick

一、高效计算k级祖先

首先对树进行长链剖分,记录每个节点所在的链的链顶,然后按深度记下每条链中的节点和这条链的长度个数个祖先,再预处理倍增数组代表2k2k祖先。根据性质二,我们跳到节点的大于k2k2次祖先,我们可以通过之前预处理出的链顶祖先中找到kk及祖先,感性理解分析可得,第一次跳highbit(k)highbit(k)次祖先最快,复杂度O(1)O(1)

总复杂度O(nlogn)+O()

代码在这里

二、快速合并以深度为下标的子树信息

这个题

posted @   heyujun  阅读(662)  评论(6编辑  收藏  举报
编辑推荐:
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
阅读排行:
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· MQ 如何保证数据一致性?
点击右上角即可分享
微信分享提示