首页 > 其他分享 >轻重链剖分

轻重链剖分

时间:2023-02-07 09:44:18浏览次数:37  
标签:链剖分 子树 题意 路径 重剖 重链 树上 轻重

概述

  • 轻重链剖分通过将树剖分为若干条重链和它们之间相连的轻边,将树上路径问题转化成序列问题。

  • 具体来讲,有很多树上路径问题本质上是把序列上的问题搬到了树上,此时我们可以进行轻重链剖分(后简记为轻重剖或重剖),将树上路径拆分为多条重链头尾相接,并通过能快速维护重链信息的数据结构来求解。

  • 重剖方式如下:

    • 定义重儿子为所有儿子中 \(siz\) 最大的一个。

    • 规定到重儿子的边为重边,其余为轻边,称连续的重边构成的链为重链。

    • 实际实现中一般还没完。将重儿子换到最前面,把树拍扁成 dfn 序,对其建立线段树,于是重链总是连续的一段,子树也总是连续的一段。

  • 重剖的优越性在于树上任意点到根的路径上至多有 \(O(\log)\) 条重链,这也代表着只会有 \(O(\log)\) 条轻边。证明如下:

    • 由重儿子 \(siz\) 最大,每次走轻边(记为从 \(now\) 到 \(fa\))时至少和一个不比 \(now\) 轻的节点共子树了。

    • 故每走一次轻边,所在子树的 \(siz\) 至少翻倍,至多翻倍 \(O(\log)\) 次。这和启发式合并的复杂度证明有异曲同工之妙,我有时也称重剖的剖分方式为“启发式分裂”。

  • p.s.重剖也可以用来求 lca,毕竟求树上路径的形式就是一个找 lca 的过程,但这么做未免太小题大做。

例题

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

  • 题意:路径加,路径求和,子树加,子树求和。

  • 即板子,由 dfn 序上重链和子树的连续性,易解。

P1505 [国家集训队] 旅游

  • 题意略。大概算是树剖板子的集大成者。

  • 首先对于树上边权问题,我们的一般处理方法是边权下放,即构建外向树然后把信息存在终点上。不能建对偶图,因为那很可能不是树。

  • 然后比较有趣的操作就是取相反数,注意细节别写挂就好,显然还可以支持路径加、子树加、子树和、子树最值等等,但那样的话实现起来就更恶心了。

P2486 [SDOI2011] 染色

  • 题意略。利用类似最大子段和的方式维护即可。

P2680 [NOIP2015 提高组] 运输计划

  • 题意略。

  • 不妨预处理出所有路径的长度,然后二分答案。

  • 对每条路径,如果其过长,则对路径上的边 \(+1\)。

  • 最后检验是否存在一条边,使得其的覆盖次数恰为不合法路径条数,且将其改为 \(0\) 权边后最长的不合法路径也合法了即可。

  • 鉴于树剖多一只 \(\log\),考虑 lca+树上差分实现。

标签:链剖分,子树,题意,路径,重剖,重链,树上,轻重
From: https://www.cnblogs.com/weixin2024/p/17097358.html

相关文章

  • 关于长链剖分的数组实现 | CF1009F Dominant Indices
    请容许我不理解一下为什么这题题解几乎全都是指针实现/kk其实长链剖分是可以直接用数组来写的。考虑朴素DP。设\(f_{u,i}\)表示以点\(u\)为根的子树中与点\(u\)距......
  • 树链剖分
    dfs序与树链剖分dfs序比如dfs序为:ABDGHICEJF时间戳时间戳即dfs每次访问到每个节点的时间,时间从1开始累加比如上图时间戳为用处把树强行搞成连续的......
  • Codeforces-343D Water Tree(树链剖分)
    Description:MadscientistMikehasconstructedarootedtree,whichconsistsof n vertices.Eachvertexisareservoirwhichcanbeeitheremptyorfilledw......
  • SPOJ375--Query on a tree(树链剖分)
    Description:Youaregivenatree(anacyclicundirectedconnectedgraph)with N nodes,andedgesnumbered1,2,3...N-1.Wewillaskyoutoperfromsomeins......
  • 树链剖分
    “在一棵树上进行路径的修改、求极值、求和”乍一看只要线段树就能轻松解决,实际上,仅凭线段树是不能搞定它的。我们需要用到一种貌似高级的复杂算法——树链剖分。树链剖分......
  • 树链剖分入门
    目录树链剖分算法思想模版-树链剖分旅行P4374P4211CF1023FP1505P2486P7735P3976Trick总结树链剖分这玩意也是才开始预习,写得不好勿喷。约定记号:\(siz[x]\),\(x\)为根的......
  • 树链剖分学习笔记
    怕到时候忘了,来写一篇笔记前置芝士:树的存储与遍历,\(dfs\)序,线段树。树链剖分的思想及能解决的问题:树链剖分用于将树分割成若干条链的形式,以维护树上路径的信息。具体......
  • 树链剖分
    简述树链剖分用于将树分割成若干条链的形式,以维护树上路径的信息。具体来说,将整棵树剖分为若干条链,使它组合成线性结构,然后用其他的数据结构维护信息。树链剖分(树剖/链......
  • 【YBT2023寒假Day1 B】不跪模样(树链剖分)(线段树)
    不跪模样题目链接:YBT2023寒假Day1B题目大意给你一棵有根数,点有点权,两种操作:对于所有x子树内与x距离不超过2的点,将其点权加v。询问x子树中,满足i<=j且i,j......
  • 轻重链剖分板子
    //LuoguP3384【模板】轻重链剖分/树链剖分#include<iostream>#include<cstring>#include<algorithm>#include<vector>#definelcu<<1#definercu<<1|1usin......