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

树链剖分

时间:2024-04-01 13:23:38浏览次数:18  
标签:剖分 idx 线段 树链 编号 重链

重链剖分

【模板】重链剖分/树链剖分

upd:每条重链必定由轻儿子开始,不同重链间必定由轻边连接,重链之内必定是重边。

如果只有一次询问的话显然可以树上差分来解决,现在考虑多组询问。

处理 fa[i] dep[i] 便于询问。

处理 size[i] son[i] top[i] idx[i] f[i] 便于树剖。

明确一下树剖时变量的定义。size[i] 代表子树大小,son[i] 代表重儿子,top[i] 代表所在重链链头的原编号,idx[i] 代表 dfn 得到的新编号,f[i] 代表新编号为 i 的点的权值。

预处理过程和树剖具体实现不再赘述,重点看树剖的细节。

我们放到线段树上的是新编号,即 idx,对于线段树上下标 i,其权值为 f[i]。

对于每组询问我们不断往上跳,注意跳的过程中我们需要保存的是原编号,不能拿新编号往上跳,查询的时候则用新编号查询。

简而言之,idx[i] 只有作为线段树查询时的参数时才能用到,而 f[i] 只有作为线段树权值时才能用到,其余一律使用旧编号

时间复杂度方面,我们以二叉树为例来解释树剖 \(O(n\log n)\) 的时间复杂度。

一.一点到根的路径上经过的重链数量不会超过 \(\log\) 条

等价于一点到根的路径上经过的轻边不会超过 \(\log\) 条。

标签:剖分,idx,线段,树链,编号,重链
From: https://www.cnblogs.com/BYR-KKK/p/18108197

相关文章

  • 【算法与数据结构】二叉树链式结构的实现【前中后序】
    文章目录......
  • 树链剖分【loj模板】(〃>目<)
    小声吐槽:如果不是拍了200000组没问题后瞪眼瞪出来了,我才不写呢Decribe:给定一棵\(n\)个节点的树,初始时该树的根为\(1\)号节点,每个节点有一个给定的权值。下面依次进行\(m\)个操作,操作分为如下五种类型:换根:将一个指定的节点设置为树的新根。修改路径权值:给定两个节点......
  • 树链剖分笔记
    树链剖分+线段树代码量通常在3K左右,出错的地方非常多,为了好好练手,特建立该题单,建议不要进行复制每一题都老老实实重打题单博客题单Orz1.区间加,区间修改,区间最大值#include<bits/stdc++.h>usingnamespacestd;constintMX=1e5+10;intn,m,r,p;intinput[MX]={0};intsiz[......
  • 树链剖分
    树链剖分1基础理论1.1基础概念在树链剖分中,我们将会遇到如下的名词,在此先做以解释:重儿子:对于一个子节点$u$如果$v$是其儿子,且$v$的子树大小是节点$u$的儿子中最大的,则称$v$是$u$的重儿子。轻儿子:除了重儿子以外,就是轻儿子。重链:除顶部以外,其余节点都为重儿子......
  • 树链剖分学习笔记
    树链剖分学习笔记树链剖分的思想及能解决的问题树链剖分用于将树分割成若干条链的形式,以维护树上路径的信息。具体来说,将整棵树剖分为若干条链,使它组合成线性结构,然后用其他的数据结构维护信息。树链剖分(树剖/链剖)有多种形式,如重链剖分,长链剖分和用于Link/cutTree的剖分(......
  • 长链剖分&DP
    长链剖分优化DP长链剖分有一些美妙的性质一个点跳到根最多经过\(\sqrtn\)条链向上跳链,链长一定会增加,最坏是\(1,2,3,...,\sqrtn\)所有长链的总链长相加为n(如说)优化DP如果dp中有一维和深度有关,就考虑优化,考虑用长儿子\(O(1)\)转移(一般是平移,考虑用指针),其他暴力转......
  • 长链剖分
    谁家刚学会一个知识点就放黑来做啊。长链剖分建议在会重链剖分的基础上再来学长链剖分。长链剖分与重链剖分不同的地方在于:重剖以子树大小来选重儿子,长剖以子树深度来选重儿子。长剖的优势有:可以\(\mathcal{O}(1)\)求\(k\)级祖先,可以在与深度有关的树形dp中优化掉一......
  • P5478 [BJOI2015] 骑士的旅行 - 重链剖分
    首先分析一下题目,对于这棵树,操作如下:查询从X到Y的路径上的前k大的值。把$P_i$上的武力值减去一个$F_i$并在Y上的武力值加上一个$F_i$,再把$P_i$改成Y。将$P_i$上的武力值减去一个$F_i$再加上一个Y,并把$F_i$改成Y。由第一个我们可以想到,先用树剖,再用......
  • P3384 【模板】重链剖分/树链剖分 - SGT && 重链剖分
    本题是非常非常非常纯粹的树剖,利用了重链剖分后下标的性质不多说上代码就好了#include<cstdio>#include<vector>#definelllonglongusingnamespacestd;constintN=1e5+5;intn,m,r;llp,a[N],b[N];vector<int>V[N];intfa[N],dep[N],siz[N],hson[N]......
  • P3038 [USACO11DEC] Grass Planting G - 重链剖分
    本题可以说是板题P3384的弱化版,只不过要改的变成了边权边权很好处理,只需要将每个边的边权下放到两端点深度比较深的上面就好了(因为每个点连比它浅的节点必定只有一条边)。那么就将模板改一下就好了代码如下:#include<cstdio>usingnamespacestd;constintN=1e5+5;in......