• 2024-09-19[学习笔记]树链剖分(简易版) 及其LCA
    树链剖分先讲解一下一些基础定义(都是在树上)重儿子:一个节点中所有儿子中子树大小最大的一个儿子(每个节点最多有一个重儿子)轻儿子:一个节点除重儿子外所有的节点重链:若干个重儿子组成的链链顶:一条链中深度最小的节点以下图为例子(红色连续线段为重链)对于节
  • 2024-09-09树链剖分
    由于是在树上搞的ds所以考察数据结构本身性质偏多,需大力注重细节。思想考虑将一颗树的链划分成若干个区间进行维护。这种划分方式叫做剖分。约束一颗有根树(有时要求换根但不是真正换根)每个点恰好包含在一条剖出的链中(若被多条链同时包含则需要同时维护多条链,修改多余
  • 2024-09-02树链剖分
    原理:将一棵树剖分成一条条的链,从而降低时间复杂度首先会一个线段树,书完成剖分后,用来维护每一条的信息。#include<bits/stdc++.h>typedefintintt;#defineintlonglong#definelck<<1#definerck<<1|1constintM=2e6+10;usingnamespacestd;intn,m,ans
  • 2024-08-26树链剖分
    树链剖分的思想及能解决的问题树链剖分用于将树分割成若干条链的形式,以维护树上路径的信息。具体来说,将整棵树剖分为若干条链,使它组合成线性结构,然后用其他的数据结构维护信息。树链剖分(树剖/链剖)有多种形式,如重链剖分,长链剖分和用于Link/cutTree的剖分(有时被称作「实链剖
  • 2024-08-26#8. 「模板」树链剖分
    题目传送门:#8.「模板」树链剖分、前置知识重链:重链(HeavyPath)是指树链剖分中的一条主要的路径,该路径上的节点数量较多,相邻节点之间的距离较近。轻链(LightPath)是指树链剖分中的其他路径,相邻节点之间的距离较远。LCA:最近公共祖先分析上树状数组首先,我们需要定义一个
  • 2024-08-23算法总结-树链剖分
    算法总结-树链剖分概念重儿子(红点):父节点\(f\)的子节点中子树大小最大的儿子。轻儿子(蓝点):父节点\(f\)的子节点中除重儿子以外的节点。重链(橙圈框出的链):链顶为轻儿子,由重儿子组成的链。重链剖分用处:将树上任意一条路径划分成不超过\(\log{n}\)条连续的链(如实
  • 2024-08-17树链剖分
    具体见OI-wiki,下面是一些补充重链要求是极大的每个点都在某一个重链中,如果一个点是重子节点,那么其在与其父亲所连的边的重链中,否则在与其重子节点所连的边的重链中这一段的原因:我们走重链是不用关心的,因为同一重链的dfs序是连续的,我们可以用其他数据结构维护,我们只用关心这条
  • 2024-08-10树链剖分
    前置知识时间戳在树的\(DFS\)中,以每个节点第一次被访问的顺序,依次给予\(N\)个点\(1-n\)的标记,通常用\(dfn[x]\)表示\(x\)号节点的时间戳。\(DFS\)序进行\(DFS\)时,对每个节点进入递归后以及回溯前各记录一次该点编号,最后产生\(2-n\)的序列即是\(DFS\)序,可设\(L[X]\)和\(R[X]\)
  • 2024-08-06树链剖分
    定义把树剖成一条条不相交的链,对树的操作就转化成了对链的操作概念重儿子:对于每一个非叶子节点,它的儿子中以那个儿子为根的子树节点数最大的儿子为该节点的重儿子轻儿子:对于每一个非叶子节点,它的儿子中非重儿子的剩下所有儿子即为轻儿子重边:连接任意两个重儿子的边叫做重
  • 2024-07-17树链剖分
    P3379【模板】最近公共祖先(LCA)dfs1:处理一个点的深度、父结点、子树大小,重儿子。dfs2:记录每个点的最顶部。query:哪个top的深度小跳哪个。#include<bits/stdc++.h>usingnamespacestd;constintN=500010,M=1000010;structedge{intto,next;}e[
  • 2024-07-14树链剖分
    引言第一次接触树链/重链剖分的时候还是学习\(Lca\),没系统性的看过剖分,今天刚重新学习了一下,还是比较神奇的,没想到一个树形结构能有这么多种神奇的操作,总的来说,树链剖分还是比较重要的一个策略正文定义先给出图示首先我们给出以下几个定义:重儿子,对于一个
  • 2024-06-22树链剖分笔记
    树链剖分:可以把路径分割成\(logn\)个区间。概念:重/轻儿子:当前节点的子节点中子树最大的子结点称为该节点的重儿子,其余都为轻儿子重/轻边:当前节点到重儿子的边称为重边,到轻儿子的边称为轻边重链:由重边构成的极大路径->区间问题好解决,考虑序列化,链不就变成区间了
  • 2024-06-19[学习笔记] 树链剖分 - 图论 & 数据结构
    树链剖分怎么说呢,感觉只要不是求最大最小值好像都可以用树上查分代替。例题[ZJOI2008]树的统计-单点修改树链查询树链剖分板子,不多说了,代码注意细节就行。该用dfn的地方不要把点的编号传进去。#include<bits/stdc++.h>usingnamespacestd;#definels(id<<1)#define
  • 2024-06-13树链剖分
    基本概念将树中的点重新编号,使得树中任意一条路径,都可以转化成O(logn)段连续区间1.将一棵树转化成一个序列2.将树中的任意一段路径转化成logn段连续区间(线段树,树状数组)重链剖分重儿子:子树数量最多的根节点(只有一个,多个都是,任选一个即可)轻儿子:其余儿子重边:重儿
  • 2024-05-21树链剖分总结
    本博客为本人对树剖可解决题目的总结。。。概念1:\(fa[u]\):\(u\)的父亲2:\(size[u]\):\(u\)节点\(u\)为子树的节点个数3:\(dep[u]\):\(u\)节点的深度4:\(wson[u]\):\(u\)节点的重儿子编号5:\(top[u]\):\(u\)节点所在重链的顶部端点6:\(dfn[u]\):\(u\)节点
  • 2024-05-21树链剖分
    树链剖分把一棵树剖分成若干条链,然后对链进行操作,维护路径上的信息。有点像分块,也是暴力做法,单个操作太慢就整个操作。我们一般用重链剖分,也就是根据子树大小把边分成轻重边。重链剖分定义重儿子:所有子节点中子树最大的节点,多个一样的取任意。轻儿子:不是重儿子的就是轻儿
  • 2024-05-21树链剖分
    树链剖分额一个怎么说感觉很鸡肋的东西,它似乎就是普通线段树加上了个路径上的修改和查询(暂时所学),但是肯定比线段树灵活。不多说,先看成果:::如何处理树上一个点到另一个点链上的操作?如果考虑暴力的话,肯定是不可行的,因为当这个树变成类似一条链的时候,我们的复杂度就可能被卡到惊人
  • 2024-05-17树链剖分代码细解
    总结回顾类文章,酌情观看。ShapeOfYou头图Linux找图太难了呜呜Theclubisn'tthebestplacetofindaloverSothebariswhereIgoMeandmyfriendsatthetabledoingshotsDrinkingfasterandthenwetalkslowYoucomeoverandstartupaconversat
  • 2024-05-15树链剖分 学习笔记
    裂缝中的阳光-林俊杰头图有多少创伤卡在咽喉有多少眼泪滴湿枕头有多少你觉得不能够被懂的痛只能沉默有多少夜晚没有尽头有多少的寂寞无人诉说有多少次的梦还没做已成空等到黑夜翻面之后会是新的白昼等到海啸退去之后只是潮起潮落别到最后你才发觉心里头的
  • 2024-05-14树链剖分 学习笔记
    树链剖分学习笔记时更。还没开始学,放个板子先。板子#include<bits/stdc++.h>#definefo(x,y,z)for(int(x)=(y);(x)<=(z);(x)++)#definefu(x,y,z)for(int(x)=(y);(x)>=(z);(x)--)typedeflonglongll;inlineintqr(){ charch=getchar();intx=0,f=1; for(;ch
  • 2024-05-02树链剖分
    树链剖分在DFS树上把连续的一段有祖先关系的单独开一个序列存储。查询每一个位置,不断地往链头条,然后跳到链头的父亲的链上\(\dots\)如果按DFS徐直接搞,会被以下数据hack可行的序列有\(:[110],[2,10],[3,12],[4,13],[5,14],[6,15],[7,16],[8,17],
  • 2024-05-02树链剖分
    树链剖分我们一般使用重链剖分,就是子树大的先剖分,应为这样可以保证时间在\(log_n\)如图,先按照\(dfs\)序遍历出有一棵树,那么\(dfs\)序就是\([1,2,3,4,5,6,7,8,9]\),如果碰到一条边上\(dfn[f]-dfn[u]!=1\)则断一次,就可以剖出链了,如图,链为\([1,2,3][4,5]
  • 2024-05-02树链剖分
    树链剖分,简称树剖,就是把一颗又大又高的树拆成一些链,方便使用某些数据结构。一般树剖我们随便DFS一下,将整棵树分成一些链,其中里面的DFS序连续。链的数量不管怎样是固定的\(O(N)\)。hack:某种DFS序是\((1,3,2,5,4,7,6,9,8,11,10)\),只要你不走运刚好,就仍然可以把单次询
  • 2024-04-25树链剖分
    link1link2前言:树链剖分实际上就是一种将树形结构剖分成一条条链状结构,并用线性数据结构来快速维护信息。重链剖分:一些定义:重儿子:一个节点的重儿子定义为它的子节点中子树节点最大的节点。轻儿子:一个节点除重儿子外的所有儿子重边:一个节点到它的重儿子的边即为重边
  • 2024-04-24树链剖分
    参考链接:https://www.cnblogs.com/dx123/p/16320467.html(感谢董晓老师)树链剖分求LCA比倍增快一些https://www.luogu.com.cn/problem/P3379#include<bits/stdc++.h>constintN=5e5+5;usingnamespacestd;intn,m,root;inth[N],ne[2*N],e[2*N],idx;intdep[N]