首页 > 技术文章 > [学习笔记]虚树

Miracevin 2019-02-13 22:00 原文

前言&&思想

一些给定树上一些点集,要处理和该点集有关的询问(例如和点集关系,点集选择限制)的题目,

很多子树没有变化,暴力没有意义。

提取出有关的点和路径,构成虚树

虚树上DP等等,难点往往在于找到非虚树部分的答案。

 

建立

1.暴力sort再sort

LCA一般都要用,所有点按照dfn序sort,相邻两点的LCA就是所有涉及到的LCA

注意,LCA可能算重!

然后所有的点(包括LCA)再按照dfn sort

利用括号序,用栈模拟,如果新来的点不在栈顶的子树范围内[dfn,dfn2]就弹出栈顶

2.LCT,还支持换根

换根LCA:以r为根,a,b的lca为lca(a,b)lca(a,r)lca(b,r)(伪LCA会被计算两次就消了)

换根dfn序:可以分类讨论子树范围,但是,虚树要sort,你怎么重载小于号?必须有dfn序,,但是不能立刻求出来。

所以,换根大师LCT闪亮登场!

 

设当前根是rt

access每个点

恰好连到和rt在一条链上就停止,在这个点上打标记

最后找每个点到根路径上第一个有标记的点,就是这个点的父亲。

复杂度还是logn,常数大

 

 

 

例题

保卫王国加强版

对n个点进行限制

 

把转移变成矩阵

然后倍增维护

和动态DP有相似之处

消耗战

 [SDOI2011]消耗战

世界树

 [HNOI2014]世界树

WC2018 通道

学了边分治再写

Codechef Sad Pairs加强版

• 给出一张图,每个点都有颜色
• 对每个点求出
• 如果把这个点从图中删去
• 那么会有多少对不连通的同色点对

推荐阅读