树链剖分

树链剖分详解 目录一、树链剖分相关概念1.为啥要剖分2.轻边和重边3.轻重边路径剖分的性质二、树链剖分的实现1.重链剖分 一、树链剖分相关概念 1.为啥要剖分 1.可以维护树路径上的信息(维护) 2.将一棵树划分成若干条链,用数据结构去维护每条链,复杂度为O(logN)O(logN)O(logN)。(复杂度低) 2.轻边和重边 将树中的边分为:轻边和重(zhong)边 定义size(x)size(x)size(x)为以xxx为根的子树的节点个数。 令vvv为xxx的儿子节点中sizesizesize值最大的节点,那么边( 阅读详情

树剖是个神奇的东西~

其实也没有那么神奇~

首先要知道树剖是什么:将一颗树分成若干条链后,对每一个链用数据结构进行维护。

我们最常用的就是开一颗线段树保存所有树链(显然我们要保证有序)

如何分链?dalao们称它叫启发式合并,什么意思呢?

对于一颗以v为根的子树,我们选择它若干儿子中,儿子的儿子数(包括儿子自己)最多的那一个儿子与v相连直到叶子节点,这么一条路径我们称它为重路径,路径上的边我们成为重边,其余的则称轻边。

#define FOR(i,L,R) for(register int i=(L);i<=(R);++i)
int n,m,cnt;
struct Graph{//构图finish 
	vector<int>G[N];
	int p[N],fa[N];
	int siz[N],son[N],dep[N];
	int top[N];
	#define to G[x][i]
	inline void dfs2(int x,int sp){
		top[x]=sp;//我们记录每一条链的链顶,对于每个轻儿子,他的top等于自己 
		p[x]=++cnt;//线段树上的映射 
		if(son[x])dfs2(son[x],sp);
		int sz=G[x].size()-1;
		FOR(i,0,sz)if(to^fa[x]&&to^son[x])dfs2(to,to);
	}
	inline void dfs1(int x,int Fa,int depth){
		int sz=G[x].size()-1;
		FOR(i,0,sz)if(to^Fa){
			dfs1(to,fa[to]=x,dep[to]=depth+1);
			siz[x]+=siz[to];//更新size值 
			if(siz[son[x]]<siz[to])son[x]=to;//求重儿子 
		}
	}
	inline void init(){
		scanf("%d",&n);
		FOR(i,1,n-1){
			int x,y;scanf("%d%d",&x,&y);
			G[x].push_back(y);
			G[y].push_back(x);
		}FOR(i,1,n)siz[i]=1;//初始化每个siz 
	}
}g;

我们简称v的轻儿子为ls,重儿子为ws

由轻重儿子的性质易知,size(ls)<size(v)/2,否则它就是ws

对于我们树剖的操作过程,在此我们我们以树上求和为例(修改和查询一模一样,只是换函数名而已):

#define top(a) g.top[a]
#define dep(a) g.dep[a]
#define p(a) g.p[a]
inline void GETSUM(int x,int y){
	int t1=top(x),t2=top(y);
	int ans=0;
	while(t1!=t2){
		if(dep(t1)<dep(t2))swap(x,y),swap(t1,t2);//我们只针对深度深的进行操作 
		ans+=t.Sum(p(t1),p(x));
		x=g.fa[t1];//显然这一块链都是被包含在内的,所以我们要跨越此链 
		t1=top(x);//更新top 
	}if(dep(x)>dep(y))swap(x,y);//当在一条链上时,我们就只用操作现在的x~y区间 
	cout<<ans+t.Sum(p(x),p(y))<<"\n";
}

显然我们的操作最多向上爬2log2(n)次,因为轻重儿子的性质决定了向上爬的次数,我们每一次修改是log2(n)的,因此树剖的时间复杂度大概是log2(n)^2,还算优秀

只要会了线段树,树剖就ok,因此线段树才是基础。

【洛谷 P3384】树链剖分【详解树链剖分】 本文根据一道树链剖分模板题对该算法进行解析。 阅读详情

相关推荐

AP发票批量付款程序(WEB ADI)

CREATE OR REPLACE PACKAGE MEW_AP_BATCH_PAYMENTS_PKG IS   PROCEDURE MAIN(P_BATCH_ID          NUMBER                 ,P_ORG_ID            NUMBER                 ,P_BANK_ACCOUNT_NAME VARCHAR2

储藏室 5051

有关树链剖分

重儿子:一个节点所有儿子中,以其为根子树大小最大的那个儿子(哪怕是相同的我们也只算其中一个)轻儿子:除了一个重儿子外,其余都是轻儿子重边:连接父亲节点与其重儿子的边重链:由若干条重边连接而成的链,先说一下如何拆分我们需要维护的数组:*dfn[]:每个点被访问的时间(并非DFS序)*sz[]:以每个点为根的子树大小*son[]:每个点的重儿子*top[]:每个点所属重链的链顶dep[]:每个点的深度fa[]:每个点的父亲(*是一定要维护的,其余不一定)

2509_93020071的博客 1953

ArcGIS实战:手把手教你用DEM和灾害点数据,5步搞定地质灾害风险区划图

本文详细介绍了使用ArcGIS进行地质灾害风险评估的完整流程,从DEM和灾害点数据出发,通过五步标准化操作生成专业风险区划图。重点讲解了信息量模型的应用,帮助读者掌握GIS技术在地质灾害易发性评价中的实践方法,提升风险评估效率与准确性。

weixin_30696427的博客 426

树链剖分详解,看这一篇就够了

树链剖分详解,看这一篇就够了

Chat_lsm2024的博客 3763

【STC8G1K08A串口使用】

STC8G1K08A串口打印“Hello world”

m0_47459564的博客 1万+

Xilinx Vitis 2020.1中Microblaze SREC SPI Bootloader初始化失败的调试与修复指南

本文详细解析了在Xilinx Vitis 2020.1开发环境中,Microblaze SREC SPI Bootloader初始化失败的常见原因与解决方案。核心问题通常源于Flash上电时序或软件配置,如`serial_flash_family`参数未生效、链接脚本设置不当或BRAM初始化文件选择错误。文章提供了从硬件配置检查、工程设置修正到代码级添加重试机制的完整调试路径,帮助开发者快速定位并修复启动故障,确保系统稳定启动。

weixin_29163857的博客 186

树链剖分(重链剖分)

本文主要针对于还没有学习过这个算法的新手同学

m0_73666576的博客 3958

用Virtuoso和Abstract完成gds2lef

需要用到的工具有virtuoso和abstract。 数模混合的项目通常需要模拟完成模块设计,把接去数字的pin打上label(text),数字的floorplan才能正式开始。 如果只需要简单的数字PR boundary和pin点位置,那么只使用virtuoso就够了,还想把模拟版图都转成lef就要用到abstract工具。 1.PR boundary+pin 1)在virtuoso中打开layout a) Gui操作: Create->P&R Objects->

m0_61544122的博客 8741

树链剖分笔记

树链剖分的作用:需要一个强大的能够对树上的数据统一处理的工具,于是有些很烦的人发明了树链剖分。具体来说,将整棵树剖分为若干条链,使它组合成线性结构,然后用其他的数据结构维护信息。树链剖分的种类:树链剖分具有多种形式,如:重链剖分长链剖分实链剖分大多数情况下(没有特别说明),树链剖分指的都是重链剖分,这也是最常用的。树链剖分的相关定义:重子节点:对于一个节点,重子节点就是其子节点中子树最大的子节点。有多个最大就任取一,没有子节点就无重子节点。轻子节点。

AcWing_Conan15的博客 2077

2024年 Flutter 面试题大全(2024.6.28持续更新中)

2024年 Flutter 面试题大全(持续更新中)

Code Metaverse 6664

【实战项目开发技术分享】机器人安全通过狭窄区域的方案

在机器人的应用领域中,有时会遇到需要机器人通过狭窄区域的情况。无论是室内还是室外,机器人需要具备适应性和灵活性,以便在狭窄的空间中进行安全、高效的导航。本文将提供一些如何让机器人通过狭窄区域的实现方案和思路,希望帮助读者可以根据实际的开发需要进行适当调整和扩展。

xiewf的博客 2万+

树链剖分详解及模板

这几天学习了一下树链剖分,顺便写一下我的理解、 早上看了一下别人的讲解,云里雾里,终于算是搞懂了、 树链剖分是解决在树上进行插点问线,插线问点等一系列树上的问题 假如现在给你一棵树,然后没两条边之间有一条权值,有一些操作,1:x---y之间的最大权值是多少,2:改变x---y之间的权值 当前这样的操作有很多,如果直接用暴力的方法的话肯定不行,那么就要想一个好的方法,我们可以想一

大神养成中..... 2万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

哇!树链剖分(树链剖分详解)

顾名思义,重链剖分就是把”重“的链与其他的链分开。

TengMaxJun的博客 1451

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

树链剖分小结及题目

我们经常会遇到这样一类题目:给出一棵树,询问树上u,v两点路径间的最值,合值,更新u,v路径上的点权或边权,或者区间更新etc,此时如果单纯的用线段树或者树状数组去搞,很明显问题不能够得到完美解决,此时就需要更高级的数据结构去对树进行重新构造,也就是通常说的树链剖分。 一.树链剖分 树链剖分,顾名思义,也就是对树的每一条链进行剖分,将一棵树拆分成若干条链,对其进行重新编号,在进行了重新编

每一次AC都是一种感动 3903

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

树链剖分总结

树链剖分总结

ZhuRanCheng的博客 823

树链剖分题目大集

树链剖分题目大集如果还没学树链剖分的伙伴可以跳转到下面的博客1.模板题 P3384 【模板】轻重链剖分/树链剖分2.洛谷-P3379 【模板】最近公共祖先(LCA)(强行用树剖写LCA)3.洛谷-P2590 [ZJOI2008]树的统计4.P3038 [USACO11DEC]Grass Planting G5.P3178 [HAOI2015]树上操作6.树链剖分+线段树 2019ICPC西安邀请赛E7.HDU - 5052 树链剖分主要是解决对于树上路径的修改和查询操作,常常结合线段树来出题,使用线段树维护

TheWayForDream 702

【树链剖分】树链剖分讲解

是什么? 将树的所有边剖分成重边和轻边从而便于维护边权信息和进行修改,应对一系列大数据书上修改查询问题。 为什么? 如果不进行剖分代价会很大:对树上边(u,v)中的边权查询修改,必然要将边权建立成搜索树或查询树进行维护,对于所有边建立后对于(u,v)修改时只能将(u,v)中所有边进行遍历修改,最坏代价(退化成链)为n*查询修改代价。而如果把(u,v)中的边变成连续的一段区间,就会大大降低时间代价

peter_819的博客 3599
上一篇: 虚树模板
下一篇: splay单旋双旋对比
DancingZ
博客等级 码龄9年 10粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值