题意:给你一棵树,给定了每条边的顺序,你需要按照顺序对每条边做如下操作
- 若两个端点都存在,则任意删除一个放入序列
- 若两个端点有一个被删除里,那么跳过这条边
问有多少种这样的序列 $n\leq 2*10^5$
首先吐槽下官方题解好多有误(不仔细的俄罗斯佬,还不给标程)
一条链的情况
自行推导
树上
对于一个点,我们把边分为$3$种。
- 与父亲的那条边$p$, $(id_p$=这条边出现的顺序$)$
- 与儿子连的边$(id_{v_i}>id_p),i\in [1,d]$
- 与儿子连的边$(id_{v_i}>id_p),i\in [d+1,sum]$
设$dp[u][3]$
- $dp[u][0]$是在第二种边,导致$u$进入队列,提前删除
- $dp[u][1]$是在第一种边,导致$u$进入队列,正好被父边删除
- $dp[u][2]$是在第三种边,导致$u$进入队列或者$u$无法进入队列。延迟删除或干脆不删除
分析$dp[u][0]$ ,从第二种边里取出一条边,轮到这条边的时候删除$v$的父亲$u$,此时$v$就处于了$dp[v][2]$这种情况,只能让后来的边将它删除,或者无法删除。
在这条边时间之前的儿子边都不能在操作的时候删除自己的父亲$u$,或者根本不能操作由于提前被删除了,则$dp[v][0]+dp[v][1]$
在这条边时间之后的儿子边都无法删除自己的父亲$u$,等待之后自己的儿子被删除的命运,或者根本不能操作由于提前被删除了,则$dp[v][0]+dp[v][2]$
代码
1 |
|