一.基本概念
1.树链剖分并不是一个复杂的算法或者数据结构,只是能把一棵树拆成链来处理而已,换一种说法,树链剖分只是xxx数据结构/算法在树上的推广,或者说,树链剖分只是把树hash到了几段连续的区间上。
二 .我说一下自己的理解吧,树链剖分其实并没有那么高端,就一个dfs序就可以解决,之所以分成重链和轻链,是因为这样可以满足两个性质:
性质1:如果(v,u)为轻边,则siz[u] * 2 < siz[v];
性质2:从根到某一点的路径上轻链、重链的个数都不大于logn。
主要用到的是第二个性质:这样可以大量减小时间复杂度;
然后采取一系列看似高端的方式,其实就是选出重链,然后把重链扔到线段树上,每次做线段树上的操作时要注意的是不能直接弄,因为只有重链可以一次性在线段树上查询,轻链是要跳的。
现在我做过的链剖主要有两类题,一类是点上存值,一类是边上存值,边上存值原来我一直弄不好,其实就是给root虚拟一条边,然后线段树查询时不走这一条边就行了。(具体方法就是dfs的u和fa带1,fr带1,建树的时候从1建到n,并且第一次就访问1节点就可以了);
然后就是线段树上操作的时候,如果是对边操作就把经典操作改一点点(经典操作:当链端节点不一样时,就选当前链端节点深度最深的点向上跳,跳过一次重链一次轻链,并且把这个节点更新为链端节点的父节点,等链端节点一样以后,如果当前节点不一样,就再访问一次中间的线段树即可,改动只在最后一部分,因为此时父节点表示的边不在路径上,所以访问线段树时要用较浅点的重链儿子在线段树上的位置(此时它们都在重链上,所以一定是重链儿子)(只有这一个地方需要特殊处理!))就可以了。
三.例题:见博客树剖部分;
树剖学习笔记
最新推荐文章于 2023-07-07 07:18:42 发布