首页 > 其他分享 >『复习笔记』树链剖分(重链剖分)

『复习笔记』树链剖分(重链剖分)

时间:2023-08-22 16:55:38浏览次数:34  
标签:剖分 树剖 链头 dfs 树链 LCA 重链 节点

前言(事出必有因)

今天模拟赛有一道线段树+LCA的题,考场上码了两个小时,结果pushup错了,结果线段树调完了,发现TLE了,原来是求LCA炸了。。

因为我用的倍增(我就是倍增狗你能把我怎么样),但是倍增的一个重要问题就是log都跑满了,但是树剖跑不满log,别问我为什么不用Tarjan,因为这题是在线的不好搞,还有一个ST表求LCA的但是我很菜不会啊~

上正文

树剖(重剖)就是把一棵树剖成若干条重链,从而求解有关树上问题。

树剖的一些基本概念,比如说轻重儿子,轻重链啥的自己都知道就不写了,就算忘了应该也能想起来。

树剖的性质:

  1. 对于一棵树,每一个点都属于一条重链(如果我们把剖剩下的叶节点也算一条重链的话)。

  2. 每个点最多有一个重儿子。如果这个点只有一个儿子,那么这个点一定是重儿子。显然,叶节点没有(重)儿子。

  3. 每条重链上的节点的 dfs 序是连续的。

  4. 如果有什么遗漏,那么以后碰到了想起来了再补充,或者大家在评论区里指出来,蒟蒻感激不尽。orz。

树剖(重剖)基本上分为两部分:

  • 第一部分是预处理,两遍dfs。

    • 第一遍求出重儿子,深度(距离),每一个节点的父节点,以及每一个子树大小。

    • 第二遍求出dfs序(树上区间),反dfs序,以及每条重链的链头。

  • 第二部分是跳链。这可以求解一些问题,诸如求LCA(这个直接跳链就可以),求链上最值,区间和,区间积(这些需要用像线段树这样的数据结构维护)等等。

    • 对于两个节点,我们先比较它们的链头的深度,如果某个节点链头的深度较大,那么就跳到链头的父节点上。直到它们都跳到了一条链上。

    • 在这个过程中我们可以以一条链为单位求解树上某条链的信息。当然我们也可以不维护任何信息求解LCA。

标签:剖分,树剖,链头,dfs,树链,LCA,重链,节点
From: https://www.cnblogs.com/Chronologika/p/17603771.html

相关文章

  • 树链剖分 | 洛谷 P4114 Qtree1
    前言题目链接:洛谷P4114Qtree1前置知识:树链剖分题意给定一棵树,有修改边权和查询两点之间边权最大值两种操作,对于每个查询输出结果。解析已经在前置博客里提到,树链剖分可以将树上的任意一条路径划分成不超过\(O(\logn)\)条连续的链,保证划分出的每条链上的节点DFS序......
  • 树链剖分详解
    目录前言一、树剖是什么?二、重链剖分树剖的实现例题总结前言在同学们一路走来的过程中,一定已经学习了倍增求LCA的算法。倍增求LCA算法只适用于少部分情况,那么,如果要求在求出LCA的同时,对两点\(a,b\)之间的所有点权(或边权)进行求和或修改,又该怎么做呢?这里介绍一种树链......
  • 杭电23多校第九场Capoo on tree(二分+树链剖分+可持久化线段树)
    2023HDU多校9__Capooontree(二分+树链剖分+可持久化线段树)题目链接Solution\(Hint1\)考虑如何进行对某一相同点权的所有点进行点权\(+1\)操作,如果我们建立权值线段树,那只需要将权值为\(x\)的点并入权值\(x+1\)即可,但是这样就算我们建立以节点编号为版本的可持久化线段树,也是......
  • VTK 实例58:三角剖分(表面重建)
    1#include<vtkAutoInit.h>2VTK_MODULE_INIT(vtkRenderingOpenGL2);3VTK_MODULE_INIT(vtkRenderingFreeType);4VTK_MODULE_INIT(vtkInteractionStyle);56#include<vtkSmartPointer.h>7#include<vtkProperty.h>8#include<vtkPo......
  • VTK 实例59:加入边界限制的三角剖分(表面重建)
    1#include<vtkAutoInit.h>2VTK_MODULE_INIT(vtkRenderingOpenGL2);3VTK_MODULE_INIT(vtkRenderingFreeType);4VTK_MODULE_INIT(vtkInteractionStyle);56#include<vtkSmartPointer.h>7#include<vtkProperty.h>8#include&......
  • 树链剖分
    引入维护一棵树,支持两种操作改变边权|边权询问路径中最大权(或其他)BF的期望是\(O(\logn)\),但是容易退化成\(O(n)\),所以引入树链刨分,这里用轻重链刨分轻重链刨分记\(SIZE_i\)表示以\(i\)为根的子树的节点个数,那么对于\(x\)为的子节点\(y\),若\(SIZE_y\)......
  • 树链剖分
    目录树链剖分相关资料例题求最近公共祖先树链剖分基础概念重儿子:父节点的所有儿子中子树节点数目最多的节点轻儿子:父节点除重儿子以外的节点重边:父节点和重儿子连成的边轻边:父节点和轻儿子连成的边重链:由多条重边连接而成的路径如下图,绿色边即为重边性质1.整棵树会被剖......
  • 树链剖分
    本文的树链剖分指的是长链剖分Part1:知识点树链剖分常用于解决下面的问题:修改树上两点之间的路径上所有点的值。查询树上两点之间的路径上节点权值的和/极值/其它(在序列上可以用数据结构维护,便于合并的信息)。下面给出一些定义:重儿子:表示一个节点的子节点中子树最大......
  • UOJ #284. 快乐游戏鸡题解(长链剖分+单调栈合并)
    UOJ#284.快乐游戏鸡题解(长链剖分+单调栈合并)题面一番战斗之后,程序猿被计算鸡们赶走了。随着垫子计算鸡一声令下:“追!”,于是计算鸡村全村上下开始乘胜追击。计算鸡们希望在新的一年到来之际给程序猿以重创,出掉这一年的恶气。可是程序猿一追就走,一走就跑,一跑就无影无踪。计算鸡......
  • 20230626-树链剖分+点分治
    20230626重链剖分计算每个节点子树大小,判断出每个点的重儿子优先遍历重儿子连边,并且按照DFS序重新编号特点:每条重链上的点编号是连续的每个点为根的子树内所有点的编号是连续的$\to$线段树需求:对于树上两点\(x,y\)路径上的所有点进行操作必然不能避免的事情......