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

树链剖分

时间:2023-08-12 22:55:35浏览次数:52  
标签:log 剖分 轻边 路径 树链 重边 SIZE

引入

维护一棵树,支持两种操作

  • 改变边权 | 边权

  • 询问路径中最大权(或其他)


BF 的期望是 \(O(\log n)\),但是容易退化成 \(O(n)\),所以引入树链刨分,这里用轻重链刨分


轻重链刨分

记 \(SIZE_i\) 表示以 \(i\) 为根的子树的节点个数,那么对于 \(x\) 为的子节点 \(y\),若 \(SIZE_y\) 是 \(x\) 子节点中最大的,则称改边为 ⌈ 重边 ⌋,否则为 ⌈ 轻边 ⌋

我们称全部由重边组成的路径为 ⌈ 重路径 ⌋

那么有如下性质

  • 若 \((u,v)\) 是轻边,则 \(SIZE_v\leq SIZE_u/2\)

  • 从根到某一点的路径上轻边个数不大于 \(O(\log n)\)

  • 每个点到根的路径上不超过 \(O(\log n)\) 个重路径 & 轻边

对于询问,先处理出 \(LCA\),暴力处理轻边,数据结构维护重边


原理还算好理解,难的是实现和常数,直接按思路写那可是要写不知道多少线段树,空间利用率低(动态数组当我没说),查询起来还要把边分成各种奇奇怪怪得东西,总之非常麻烦,我们考虑将所有线段树合并,具体而言

  • 是按遍历顺序(重->轻)将原树重新排号,使得重链的点在区间上连续

这样方便维护,还保证了空间和常数


正常人维护都是先求 \(LCA\) 再修改,但也可以不用,常数的事

注意自己维护的是点权还是边权

复杂度是 \(O(\log n^2)\)

标签:log,剖分,轻边,路径,树链,重边,SIZE
From: https://www.cnblogs.com/chelsyqwq/p/17625751.html

相关文章

  • 树链剖分
    目录树链剖分相关资料例题求最近公共祖先树链剖分基础概念重儿子:父节点的所有儿子中子树节点数目最多的节点轻儿子:父节点除重儿子以外的节点重边:父节点和重儿子连成的边轻边:父节点和轻儿子连成的边重链:由多条重边连接而成的路径如下图,绿色边即为重边性质1.整棵树会被剖......
  • 树链剖分
    本文的树链剖分指的是长链剖分Part1:知识点树链剖分常用于解决下面的问题:修改树上两点之间的路径上所有点的值。查询树上两点之间的路径上节点权值的和/极值/其它(在序列上可以用数据结构维护,便于合并的信息)。下面给出一些定义:重儿子:表示一个节点的子节点中子树最大......
  • UOJ #284. 快乐游戏鸡题解(长链剖分+单调栈合并)
    UOJ#284.快乐游戏鸡题解(长链剖分+单调栈合并)题面一番战斗之后,程序猿被计算鸡们赶走了。随着垫子计算鸡一声令下:“追!”,于是计算鸡村全村上下开始乘胜追击。计算鸡们希望在新的一年到来之际给程序猿以重创,出掉这一年的恶气。可是程序猿一追就走,一走就跑,一跑就无影无踪。计算鸡......
  • 20230626-树链剖分+点分治
    20230626重链剖分计算每个节点子树大小,判断出每个点的重儿子优先遍历重儿子连边,并且按照DFS序重新编号特点:每条重链上的点编号是连续的每个点为根的子树内所有点的编号是连续的$\to$线段树需求:对于树上两点\(x,y\)路径上的所有点进行操作必然不能避免的事情......
  • 长链剖分
    类似于轻重链剖分,也有一种树链剖分方式叫做长链剖分,每次我们选子树深度最大的节点当做重儿子,注意这里子树深度是指一棵子树中所有结点的深度最大值。有以下性质:一个节点的\(k\)级祖先所在链的长度一定大于等于\(k\)。比较显然。因为如果小于\(k\)的话就会选从那个祖先到......
  • 树链剖分模板
    区间,边权描述松鼠爸爸为了让松鼠宝宝更熟悉地熟悉采松果的流程,为其定制了一颗“树”,树上有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:每个节点所在长链末端为其子树......