Noip 2018前最后一篇博客

本文探讨了虚树的概念及其构建方法,特别是在处理树上点的LCA问题时的应用。通过按照点的dfn序排序,并使用栈来维护当前处理的链,实现了对虚树的有效构建。文中详细解释了在不同情况下如何处理节点,以确保正确地构建虚树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

去年还猜了要考什么,然而果然猜错了。我还是毒奶今年会考去年写的这个。

只要不出什么大搜索之类的东西就行。

赛前本来还想学一下一直没怎么搞明白的东西,然而发现还是不会,于是跪了。

反正现在还不会什么manacher\text{manacher}manacher,类欧之类的鬼畜玩意。

下面进入正题

虚树

树上有k\text{k}k个点,然后枚举两两个点,加入他们的lca\text{lca}lca然后构成的树。大小是O(k)\text{O(k)}O(k)的。

考虑怎么做:先按照点的dfn\text{dfn}dfn序排序,然后维护一条链,表示当前维护的一个东西,这个用一个栈来实现,如果当前栈顶的点是top\text{top}top,新加入的点为p\text{p}p,然后分情况讨论:

1)lca(top , p) = top\text{lca(top , p) = top}lca(top , p) = top 说明这个p\text{p}p还在链上,直接加上去就好了。

2)否则,top\text{top}topp\text{p}p分别位于lca\text{lca}lca的两个不同的子树中,我们现在就要把top\text{top}top这颗子树处理完,怎么做,一直pop\text{pop}pop呗,直到跳到了lca\text{lca}lca或者lca\text{lca}lca的祖先。这里要注意的是如果lca\text{lca}lca不在栈中,要把lca\text{lca}lca加入栈中。

为了防止一些无聊的特判,先把1\text{1}1加入栈中,这个栈中就会一直有点了。

然后,完了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值