首页 > 其他分享 >长链剖分

长链剖分

时间:2023-07-13 21:47:54浏览次数:30  
标签:长链 剖分 祖先 复杂度 长度 重链

类似于轻重链剖分,也有一种树链剖分方式叫做长链剖分,每次我们选子树深度最大的节点当做重儿子,注意这里子树深度是指一棵子树中所有结点的深度最大值。

有以下性质:

  • 一个节点的 \(k\) 级祖先所在链的长度一定大于等于 \(k\)。

比较显然。因为如果小于 \(k\) 的话就会选从那个祖先到这个节点的路径当做重链。

  • 所有链的总长是 \(O(n)\)

比较显然。因为重链不交,可以近似看做是对整个树的划分。

  • 任意一个点向上跳跃重链的次数不会超过 \(\sqrt n\) 次。

我们一直向上跳,每次跳到的一个点所在重链长度最小是上个点的重链长度加 \(1\),所以我们一直经过的重链长度最多是 \(1,2,...\sqrt n\),由此可知性质得证。

求 \(k\) 级祖先

求 \(k\) 级祖先,长链剖分可以做到 \(O(n\log n)\) 预处理,\(O(1)\) 查询。

具体做法如下:我们倍增处理所有结点的祖先,然后对于每个链,设链长为 \(len\),处理出该链链顶向上,向下(顺着链向下)长度为 \(len\) 的每一个点。这是预处理。

对一个查询,设为 \(x,k\),表示我们要查询 \(x\) 的 \(k\) 级祖先,我们考虑设 \(r\) 为 \(k\) 的最高二进制位表示的那个二进制数,我们考虑寻找 \(x\) 的 \(2^r\) 祖先,由性质 \(1\),我们可以得到这条重链的长度一定是大于等于 \(2^r\) 的,这样我们就可以保证,我们要查询的点,一定是被我们预处理过了。所以我们可以通过判断被查询点和该链顶点的深度来进行 \(O(1)\) 的查询。

长链剖分优化 dp

具体方法是,我们在合并信息的时候,直接把重儿子的承接过来,其余儿子的信息暴力统计,这样做的话时间复杂度是 \(O(n)\) 的。

考虑证明。当一个儿子的信息被暴力统计时,这个儿子一定是其所在重链的链顶,那么合并这个儿子的信息的时间复杂度可以看做其所在重链的长度。

由此可以看出,总的暴力合并的复杂度不会超过链的总长,由此可以得到时间复杂度为 \(O(n)\)。

当然,大多是当这个 DP 与深度有关时才这么做,这样暴力合并的复杂度才不会超过链的总长。

标签:长链,剖分,祖先,复杂度,长度,重链
From: https://www.cnblogs.com/HeNuclearReactor/p/17552249.html

相关文章

  • 树链剖分模板
    区间,边权描述松鼠爸爸为了让松鼠宝宝更熟悉地熟悉采松果的流程,为其定制了一颗“树”,树上有n个点,n-1条边(无环),每条边上都有一定数量的松果。松鼠爸爸为了让松鼠宝宝得到更多的松果,有m次操作,每次操作给定两个点x,y和一个add,在x点到y点的简单路径上所有......
  • BZOJ 2243: [SDOI2011]染色 树链剖分+线段树
    2243:[SDOI2011]染色TimeLimit: 20Sec  MemoryLimit: 512MBSubmit: 7623  Solved: 2855[Submit][Status][Discuss]Description给定一棵有n个节点的无根树和m个操作,操作有2类:1、将节点a到节点b路径上所有点都染成颜色c;2、询问节点a到节点b路径上的颜色段数量(连续......
  • 树链剖分
    P3379【模板】最近公共祖先(LCA)本题中的树链剖分均指重链剖分。这里不使用重链剖分作为模板是因为这道题更加典型,不需要使用额外的数据结构,就是纯天然、无污染的树剖(我诗兴大发喝多了)。首先,树剖是一个思想,可以将树上两点路径的问题转变为一个序列上,不超过\(O(\logn)\)段的问......
  • 【代码仓库】【模板】树链剖分
    #include<bits/stdc++.h>#definerep(i,a,b)for(inti=(a);i<=(b);i++)#definepre(i,a,b)for(inti=(a);i>=(b);i--)#defineEde(i,u)for(inti=h[u];i;i=ne[i])#definego(i,a)for(autoi:a)//#defineintlonglong#def......
  • 【学习笔记】(18) 长链剖分
    长链剖分1.算法简介与性质长链剖分本质上就是另外一种链剖分方式。长链剖分与重链剖分有相通之处,后者是将子树大小最大的儿子作为重儿子,前者则是将子树深度最大的儿子作为重儿子。可见两者只是换了一个剖分形式。长链剖分有如下性质:性质1:每个节点所在长链末端为其子树......
  • HDU3966(树链剖分)
    题目:Aragorn'sStory 题意:给一棵树,并给定各个点权的值,然后有3种操作:IC1C2K:把C1与C2的路径上的所有点权值加上KDC1C2K:把C1与C2的路径上的所有点权值减去KQC:查询节点编号为C的权值 分析:典型的树链剖分题目,先进行剖分,然后用线段树去维护即可,注意HDU的OJ采用Windows系统,容易......
  • 4543: [POI2014]Hotel加强版[树形DP+长链剖分]
    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4543 解题思路:长链剖分定义:f[i][j]表示以i为根节点的子树,有多少个节点和i的距离是j的.g[i][j]表示以i为根节点的子树,在子树外一个距离i为j的点可以跟i子树内的两个点组成两两相等的方案数.那么就有:f[u][j+1]+=f[v......
  • 树链剖分
    前言以下内容大多摘抄自董晓算法前置芝士相关定义重儿子:父节点的所有儿子中子树结点数目最多的结点轻儿子:父节点中除了重儿子之外的儿子重边:父结点和重儿子连成的边轻边:父结点和轻儿子连成的边重链:由多条重边连接而成的路径前置数组含义\(fa[u]\):存\(u\)的父节点\(......
  • 树链剖分
    我不会做ppt/ll先来看一棵树:树剖的经典问题:两种操作,一种是将点\(u\)到点\(v\)路径上所有点加上一个值;第二种是查询路径\(u\)到路径\(v\)的点权之和。显然,普通的树上差分已经无法解决这种问题了。于是我们需要一种预处理来降低复杂度。区间修改,这肯定用到线段树,但是......
  • 【iOS开发】后台定位&&socket长链接
    参考:iOS9后台定位无限后台定位注意:这个上架appstore可能会被拒绝,如果你的应用不是和地图类相关的话。目前没想到好的解决方案,有的话请发邮件告诉博主一下,谢谢!!!......