虚树

题单介绍

# 虚树 ## 前置芝士 [虚树1](https://www.cnblogs.com/zzqsblog/p/5560645.html) [虚树2](https://oi-wiki.org/graph/virtual-tree/) 所谓虚树吧,其实就是把一些有用的点给拿出来,然后通过最少的lca把这些节点给穿到一起,在新的树上做树形dp。 感觉这个专题的题目都挺好的,所以就基本上都写了篇题解。。 ## 例题略解 ### [P3233 [HNOI2014]世界树](https://www.luogu.com.cn/problem/P3233) [**题解**](https://www.luogu.com.cn/blog/Varuxn/solution-p3233) ### [P2495 [SDOI2011]消耗战](https://www.luogu.com.cn/problem/P2495) 半个板子题,大致思路就是先构建虚树,然后在虚树上做树形dp。 先求出每个点到根节点路径上的最小值,然后在dfs时,区分有供给的岛和没有供给的岛,分不同情况转移就好了。 [$code$](https://www.luogu.com.cn/paste/0e27ynwq) ### [P3320 [SDOI2015]寻宝游戏](https://www.luogu.com.cn/problem/P3320) 有一点虚树的思想,但是实现上好像没有用到常规虚树的板子。 不难发现,最后的答案就是各个关键点之间的路径的权值乘2。 然后可以化成: $$dis(s_n,s_1)+\sum\limits_{i=1}^{n-1}dis(s_i,s_{i+1})$$ 然后不难发现插入点为x,并且他的dfs序两边是y和z的时候i,贡献就是$dis(x,y)+dis(x,z)-dis(y,z)$ 然后用STL的set维护就好了(当然平衡树,树状数组等也可以)。 * 注意:set容器里元素不能`it+1`或者`it-1`,应该是`it++`或者`it--`这一类的。。。 [$code$](https://www.luogu.com.cn/paste/pw6xsvzl) ### [P4103 [HEOI2014]大工程](https://www.luogu.com.cn/problem/P4103) [题解](https://www.cnblogs.com/Varuxn/p/14961038.html) ### [P5327 [ZJOI2019]语言](https://www.luogu.com.cn/problem/P5327) [题解](https://www.cnblogs.com/Varuxn/p/14980663.html)

题目列表

  • [HNOI2014] 世界树
  • 【模板】虚树 / [SDOI2011] 消耗战
  • [SDOI2015] 寻宝游戏
  • [HEOI2014] 大工程
  • [ZJOI2019] 语言