【线段树】【DFN】2019雅礼集训 two

题意:

在这里插入图片描述


分析:

翻译一下题意:给出两个N个点的树,首先选择A树中的一条边删除,然后将所有包含此边的路径u->v(要求u,v在B树中是相邻的),对应的B树中的边(u,v)删除。

由于扯到了子树,显然可以考虑DFN的方法。
很明显,路径包含关系在DFN中表示为:对于一条边(u,v),假设深度 d e e p u = d e e p v + 1 deep_u=deep_v+1 deepu=deepv+1
那么所有包含此边的路径必然满足:
l u ≤ d f n a ≤ r u ≤ d f n b 或 d f n a ≤ l u ≤ d f n b ≤ r u l_u\leq dfn_a\leq r_u \leq dfn_b或dfn_a\leq l_u\leq dfn_b\leq r_u ludfnarudfnbdfnaludfnbru
l u ( = d f n u ) l_u(=dfn_u) lu(=dfnu)表示进入这个节点时的dfn位置。
r u r_u ru表示离开这个节点的dfn位置。

由于每条边最多删除一次,所以有种很直观的方法是:维护当前状况下,是否存在要删除的边,如果有,就暴力找到它并删除。这样就可以巧妙地避免维护哪些边要被删除的信息。

接下来的操作就很简单了:对于B中的每条边,在其两个端点在A树的DFN序的位置,分别插入另一个端点。对A中的边也对应地操作。

然后就是维护区间最小&最大值,每次删除一条边时 ( u , v ) , ( d e e p u = d e e p v + 1 ) (u,v),(deep_u=deep_v+1) (u,v)(deepu=deepv+1),在 [ l

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值