题意:
分析:
翻译一下题意:给出两个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 lu≤dfna≤ru≤dfnb或dfna≤lu≤dfnb≤ru
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