虚树 总结
我不相信人类......但是,我相信人类的“可能性”
深藏不露是一种卓越的才能
Luogu题单
虚树
前置芝士
所谓虚树吧,其实就是把一些有用的点给拿出来,然后通过最少的lca把这些节点给穿到一起,在新的树上做树形dp。
感觉这个专题的题目都挺好的,所以就基本上都写了篇题解。。
例题略解
P3233 [HNOI2014]世界树
P2495 [SDOI2011]消耗战
半个板子题,大致思路就是先构建虚树,然后在虚树上做树形dp。
先求出每个点到根节点路径上的最小值,然后在dfs时,区分有供给的岛和没有供给的岛,分不同情况转移就好了。
P3320 [SDOI2015]寻宝游戏
有一点虚树的思想,但是实现上好像没有用到常规虚树的板子。
不难发现,最后的答案就是各个关键点之间的路径的权值乘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--
这一类的。。。