码迷,mamicode.com
首页 > 其他好文 > 详细

树链剖分

时间:2019-07-21 13:20:15      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:基本   例题   修改   一点   倍增   不同   安装软件包   安装   优先   

树链剖分

前言:虽然noip基本不考,但我觉得还是多少学一点吧


问题模型

对于树上的某条路径,进行一系列操作(类似线段树上的操作)


实现原理

恰如其名,将树剖分成一段又一段的区间(树链),便于我们进行线段树的操作(树上的线段树操作)。将树分为重链和轻链,重链的dfs序(与其他dfs序不同,树剖的dfs序会优先落在重链上)多为一段连续的区间。因此当解决两点间路径上的查询和修改问题时,可以用类似于LCA(其实区别较大,LCA是通过倍增来跳,而树剖是通过重链来跳)的方法,将两点之间的路径剖分成多条首尾相连的树链,每条树链上的点所在区间是连续的,进而进行线段树的操作。


例题

[Noi2015]软件包管理器

解析:虽然是NOI的题,但却是一道Day1 T2的除了题意比较冗长外的极水的树链剖分裸题。安装软件包就是将根节点到x节点的路径上所有值变为1,卸载软件包就是将x节点和它所有子树节点的值变为0,而x和它的子树节点在树链剖分中恰好是一段连续的区间[seg[x],seg[x]+size[x]-1],然后直接树链剖分做就可以了。

树链剖分

标签:基本   例题   修改   一点   倍增   不同   安装软件包   安装   优先   

原文地址:https://www.cnblogs.com/LianQ/p/11220780.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!