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

树链剖分

时间:2024-05-02 18:56:40浏览次数:26  
标签:sz 重链 剖分 top son 树链 节点

树链剖分 在 DFS 树上把连续的一段有祖先关系的单独开一个序列存储。

查询每一个位置, 不断地往链头条, 然后跳到链头的父亲的链上 \(\dots\)

如果按 DFS 徐直接搞, 会被以下数据 hack

可行的序列有 \(:[1 10], [2, 10], [3, 12], [4, 13], [5, 14], [6, 15], [7, 16], [8, 17], [9, 18]\), 如果查询从 \(18 \to 1\), 单次时间复杂度 \(O(N)\)

重链优化

对于一个节点, 选他儿子子树最大的儿子最当前节点链的后续。

这样, 考虑一个节点往根跳, 每一次, 为了不会父亲在一个重链上, 至少有一个兄弟的节点数量 \(\ge\) 当前的数量, 所以为了让这个节点到根经过 \(k\) 个重链, 整个树至少要有 \(2^k\) 个节点。所以如果有 \(n\) 个点, 单次查询最坏是 \(O(\log_2 n)\)。

这样子的序列也满足 DFS 序的性质

伪代码

void dfs1(int u){
  sz[u] = 1;
  for(auto v : g[u]){
    dfs1(v);
    sz[u] += sz[v];
    if(sz[son[u]] < sz[v]){
      son[u] = v;
    }
  }
}

void dfs2(int x){
  dfn[x] = ++cnt;
  if(son[x]){
    top[son[x]] = top[x];
    dfs2(son[x]);
  }
  for(auto v : g[x]){
    if(v != son[x]){
      top[v] = v;
      dfs2(v);
    }
  }
}

标签:sz,重链,剖分,top,son,树链,节点
From: https://www.cnblogs.com/liuyichen0401/p/18170429

相关文章

  • 树链剖分
    树链剖分我们一般使用重链剖分,就是子树大的先剖分,应为这样可以保证时间在\(log_n\)如图,先按照\(dfs\)序遍历出有一棵树,那么\(dfs\)序就是\([1,2,3,4,5,6,7,8,9]\),如果碰到一条边上\(dfn[f]-dfn[u]!=1\)则断一次,就可以剖出链了,如图,链为\([1,2,3][4,5]......
  • 树链剖分
    树链剖分,简称树剖,就是把一颗又大又高的树拆成一些链,方便使用某些数据结构。一般树剖我们随便DFS一下,将整棵树分成一些链,其中里面的DFS序连续。链的数量不管怎样是固定的\(O(N)\)。hack:某种DFS序是\((1,3,2,5,4,7,6,9,8,11,10)\),只要你不走运刚好,就仍然可以把单次询......
  • 重链剖分题目选讲
    染色给定一棵\(n\)个节点的无根树,共有\(m\)个操作,操作分为两种:将节点\(a\)到节点\(b\)的路径上的所有点(包括\(a\)和\(b\))都染成颜色\(c\)。询问节点\(a\)到节点\(b\)的路径上的颜色段数量。颜色段的定义是极长的连续相同颜色被认为是一段。例如112221由......
  • 树链剖分
    link1link2前言:树链剖分实际上就是一种将树形结构剖分成一条条链状结构,并用线性数据结构来快速维护信息。重链剖分:一些定义:重儿子:一个节点的重儿子定义为它的子节点中子树节点最大的节点。轻儿子:一个节点除重儿子外的所有儿子重边:一个节点到它的重儿子的边即为重边......
  • 树链剖分
    参考链接: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]......
  • 树链剖分lca笔记
    树链剖分求lca参考资料:https://www.cnblogs.com/cangT-Tlan/p/8846408.html[树链剖分lca]大佬讲的很清楚%%%orz这篇博客是我的学习笔记。树链剖分:树链剖分,计算机术语,指一种对树进行划分的算法,它先通过轻重边剖分将树分为多条链,保证每个点属于且只属于一条链,然后再通过数据结......
  • 「树链剖分」 学习笔记
    一,树链剖分的思想与概述正如其名,树链剖分用于将树剖分成若干条链的形式,以维护树上路径的信息,其中剖分出的链有多种形式,最常见的是重链,还有长链或更多其它的链。其中剖分出的链为重链时,就引出了下文的主角「重链剖分」。重链剖分能保证划分出的每条重链上的节点DFS序连续,因此......
  • 树链剖分 学习笔记
    随便写一点。1.原理定义重儿子为子树内子树大小最大的任一个点,重边为重儿子向其父亲连的边,其余为轻边。根据定义,轻边的父亲的子树大小一定不小于这个点的子树大小的二倍。又可以证出重边数量是\(O(\logn)\)的。因此可以用线段树维护这个东西。2.应用2.1dsu2.2lca考......
  • 【学习笔记】树链剖分
    一、重链剖分1.定义&作用树链剖分用于解决在树上执行的操作,将树上操作变为区间操作。用区间来维护。2.主要思想&实现有一棵树然后,我们把边区分一下,有一些边是“重边”,其余的是“轻边”,像这样:(红边为重边,黑边为轻)重边和轻边如何确定呢?看每一个结点旁的红色数字,代表他......
  • 1039. 多边形三角剖分的最低得分
    题目链接:实现一、记忆化搜索classSolution{public:intminScoreTriangulation(vector<int>&values){intn=values.size();intmemo[n][n];memset(memo,-1,sizeofmemo);//-1表示还没有计算过function<int(int,int)>df......