Noip 2018前最后一篇博客

6 篇文章 0 订阅
1 篇文章 0 订阅

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

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

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

反正现在还不会什么 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} top p \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加入栈中,这个栈中就会一直有点了。

然后,完了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值