浅谈树链剖分

Posted hzf29721

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈树链剖分相关的知识,希望对你有一定的参考价值。

Ⅱ、预备知识

树链剖分,又叫重链剖分,树剖。顾名思义,就是在树上将树划分为一条条链,然后进行树上修改与查询操作(针对于结点操作,边权操作后面会讲),用线段树来维护保证时间复杂度(数据结构模板)。一般来说,可以支持以下几种操作:
1、树上路径区间修改
2、树上路径间的区间查询(如点权之和,最大值等)
讲道理实际上线段树能做的它在树上都能做QAQ
接下来进入毒瘤内容

Ⅲ、抛出问题

先看一道板子

题目描述

如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作:
操作1:格式:1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z
操作2:格式:2 x y 表示求树从x到y结点最短路径上所有节点的值之和
操作3:格式:3 x z 表示将以x为根节点的子树内所有节点值都加上z
操作4:格式:4 x 表示求以x为根节点的子树内所有节点值之和

输入输出格式

输入格式:

第一行包含4个正整数N、M、R、P,分别表示树的结点个数、操作个数、根节点序号和取模数(即所有的输出结果均对此取模)。
接下来一行包含N个非负整数,分别依次表示各个节点上初始的数值。
接下来N-1行每行包含两个整数x、y,表示点x和点y之间连有一条边(保证无环且连通)
接下来M行每行包含若干个正整数,每行表示一个操作,格式如下:
操作1: 1 x y z
操作2: 2 x y
操作3: 3 x z
操作4: 4 x

输出格式:

输出包含若干行,分别依次表示每个操作2或操作4所得的结果(对P取模)

输入输出样例

输入样例#1:

5 5 2 24
7 3 7 8 0
1 2
1 5
3 1
4 1
3 4 2
3 2 2
4 5
1 5 1 3
2 1 3

输出样例#1:

2
21

说明:

时空限制:1s,128M
数据规模:
对于30%的数据:(Nleq 10,Mleq 10)
对于70%的数据:(Nleq{10}^3,Mleq{10}^3)
对于100%的数据:(Nleq{10}^5,Mleq{10}^5)
(其实,纯随机生成的树LCA+暴力是能过的,可是,你觉得可能是纯随机的么233)
样例说明:
树的结构如下:
技术分享图片
各个操作如下:
技术分享图片
故输出应依次为2、21(重要的事情说三遍:记得取模)

Ⅳ、分析问题

先把几个概念弄明白:

sz[u] 子树u的大小,包括u本身
dep[u] 结点u的深度,根节点深度为1
重儿子 节点u的子树中,sz最大的那个子树的根,用son[u]表示(叶结点无重儿子)
重链 由连接结点与其重儿子的边连接而成的路径(单独的结点也是一条重链)
轻链 又叫轻边,树中除了重链剩下的边
top[u] 结点u所在重链dep最小的结点(也就是最上面的点)

原谅我语文不好。。。
放张图吧QAQ
技术分享图片
画的真帅
如图绿色框起来的是重链,橙色的是top,红的边是重链里的边,蓝的是轻边,可以发现轻边连接两条重链
举个栗子:
top[8]=8;top[7]=1;top[5]=2;son[1]=2;son[2]=8;son[6]=7;sz[2]=4;

以上是关于浅谈树链剖分的主要内容,如果未能解决你的问题,请参考以下文章

浅谈树链剖分

浅谈树链剖分

蒟蒻浅谈树链剖分之一——两个dfs操作

浅谈树剖---树链剖分简易入门教程

浅谈树剖---树链剖分简易入门教程

BZOJ 2243--染色(树链剖分)