虚树
Icefox_zhx
这个作者很懒,什么都没留下…
展开
-
bzoj2286 [Sdoi2011]消耗战(虚树+树形dp)
所谓的虚树,就是只保留有用节点,把其他点都缩掉。 比如此题,对于每一个询问我们都去树形dp一遍的话就是O(nm)O(nm),T飞。 但是因为总的K<=500000,我们考虑可不可以每次询问时把树缩一缩,把树的大小控制在O(k)O(k),这样总的复杂度就是O(k)O(k)得了。可以的!我们考虑只保留询问的K个关键点,以及这些关键点两两之间的lca,可以证明,lca最多只有K-1个。这样这棵树就是O原创 2018-04-25 15:42:41 · 163 阅读 · 0 评论 -
bzoj3572 [Hnoi2014]世界树(虚树+树形dp+倍增+二分)
首先我们还是针对每一次询问建出虚树。在虚树上搞事情,这样复杂度就只与关键点个数有关了。我们考虑一棵虚树怎么统计答案。我们首先两遍dfs求出虚树上每个点最近的关键点,记作bel。 然后考虑虚树上的每一条边x->y.首先倍增的求出x在原树上的儿子(即x->y路径上的第一个点z)。那么原树上在x->y之间的就有sz[z]-sz[y]个点。(即原树上x->y这条链(不含首尾)及挂在这条链上的所有点)。原创 2018-04-25 20:51:00 · 241 阅读 · 0 评论 -
bzoj3611 [Heoi2014]大工程(虚树+lca+树形dp)
关键还是在于K个点两两之间的lca最多只有k-1个。 因此我们可以建出虚树,然后一遍dp求出所有答案。 复杂度O(K)O(K)原创 2018-04-25 22:10:35 · 217 阅读 · 0 评论 -
bzoj3991 [SDOI2015]寻宝游戏(虚树+set)
动态删减关键点,我们发现答案就是虚树的边长和*2. 而虚树的边长和二倍正好就是把所有关键点按dfs序排序后相邻两点间的距离和。(包括最后一个和第一个的距离和)因此我们用set维护一下即可。原创 2018-04-25 23:22:07 · 281 阅读 · 0 评论 -
bzoj5287 [Hnoi2018]毒瘤(树形dp+枚举+虚树)
求一张连通无向图的独立集个数。特点是边数-点数<=11. 首先如何求一棵树的独立集个数呢?我们可以树形dp: f[x][0/1]表示x子树内不选/选根x的独立集个数。我们有转移: f[x][0]=∏(f[y][0]+f[y][1])f[x][0]=∏(f[y][0]+f[y][1])f[x][0]=\prod(f[y][0]+f[y][1]) f[x][1]=∏f[y][0]f[x]...原创 2018-06-07 20:56:09 · 410 阅读 · 0 评论 -
bzoj5329 [Sdoi2018]战略游戏(圆方树+虚树)
我们搞出圆方树,那么能把两个点x,y分开的点就是树上x,y之间路径上的圆点个数(不包括x,y)。 对于一个集合的点来说就是求这些点任意两点的链的并。 而这就是这些点的虚树的边长和。于是对这些点建出虚树即可。 在连一条虚树上的边(x,y)时,计算这条链对答案的贡献(不含y),最后再加上虚树根的贡献即可。 复杂度O(n+m+|S|(log|S|+logn))O(n+m+|S|(log|S|+l...原创 2018-06-01 09:48:32 · 509 阅读 · 0 评论 -
6.24NOI 模拟赛
A.小w、小j和小z 我可能是个傻子,两个人i,j相撞的要求就是 si<sj,ti>tj或者si>sj,ti<tjsi<sj,ti>tj或者si>sj,ti<tjsitj或者si>sj,tiO(logwnk)O(logwnk)O(logwnk)水了80,其实按s排序之后不就是问你最少删掉几个使得剩下的序列为上升序列嘛…直接求个lis就好了 复杂...原创 2018-06-24 23:03:03 · 336 阅读 · 0 评论