CodeForces 1396E. Distance Matching
题目简述:给定一棵$n$($2 \leq n \leq 10^5$为偶数)个节点的树,以及$1 \leq k \leq n^2$。要求找到完全匹配$f: [n] \to [n]$,使得距离之和
$$ S(f) = \frac 1 2 \sum_{i \in [n]} \mathit{dis}(i, f(i)) = k, $$
其中,$[n] = \{1, 2, \dots, n\}$,$\mathit{dis}(u, v)$表示节点$u$与节点$v$的距离。
这里,一个完全匹配$f: [n] \to [n]$应满足:$f(f(i)) = i$且$f(i) \neq i$。
解:
这题思路类似于CodeForces 1280C. Jeremy Bearimy ,CodeForces 1387B2. Village (Maximum),AtCoder AGC 018 D. Tree and Hamilton Path。
对每一条边$e$,我们考虑经过其的匹配个数$\mathit{c}_e$。设这条边将树分成大小为$x_e$和$y_e$的两个部分,令$z_e = \min\{x_e, y_e\}$,则
- 至少有$z_e \bmod 2$个匹配经过$e$;
- 至多有$z_e$个匹配经过$e$。
综上,我们有$z_e \bmod 2 \leq c_e \leq z_e$。因此,
$$ \sum_e (z_e \bmod 2) \leq S(f) \leq \sum_e z_e. $$
另一方面,
$$ S(f) = \frac 1 2 \sum_{i \in [n]} \left( \mathit{depth}(i) + \mathit{depth}(f(i)) - 2 \mathit{depth}(\mathit{lca}(i, f(i))) \right) \equiv \sum_{i \in [n]} \mathit{depth}(i) \equiv \sum_{e} z_e \pmod 2, $$
其中$\mathit{depth}(u)$为节点$u$的深度(根节点深度为$0$),$\mathit{lca}(u, v)$表示节点$u$与节点$v$的最近公共祖先。
至此,我们得到了有解的必要条件,即$\sum_e (z_e \bmod 2) \leq k \leq \sum_e z_e$且$k \equiv \sum_e z_e \pmod 2$。接下来,我们证明这个条件也是充分的,即若$k$满足条件,则必存在一个完全匹配$f$使得$S(f) = k$。
为方便描述,我们设当前树为$T$,令$L(T) = \sum_e (z_e \bmod 2)$,$R(T) = \sum_e z_e$。则我们要证
命题:对任意树$T$以及自然数$k$,若$L(T) \leq k \leq R(T)$且$L(T) \equiv R(T) \equiv k \pmod 2$,则必存在一个完全匹配$f: [n] \to [n]$,使得$S_T(f) = k$。
我们采用数学归纳法。
基础:当$n = 2$时,树的形态只有一种,完全匹配$f$也只有一种,并且这种情况下$k$只能$=1$,这种情况的正确性是显然的。
归纳:假设$n = 2m-2 (m \geq 2)$时命题成立,考虑$n = 2m$。我们取树的重心$G$(如有多个,则取任意其中之一),并以$G$为根建树,我们注意到此时
$$L(T) = \sum_{i \in [n] \setminus \{G\}} \mathit{size}(i) \bmod 2, $$
$$R(T) = \sum_{i \in [n] \setminus \{G\}} \mathit{size}(i),$$
其中$\mathit{depth}(u)$为节点$u$的深度(根节点深度为$0$),$\mathit{size}(u)$为节点$u$对应子树的大小。
- 若$k = R(T)$,则直接求出树的DFS序$r_i$(以任意节点为根的DFS序均可),应用移位技巧,将$r_i$与$r_{i+n/2}$匹配即可。
- 否则,我们取$G$的儿子$g$,使得$\mathit{size}(g)$最大(如有多个,则任取一个)。此时必有$\mathit{size}(g) \geq 2$(若不然,则$k = \sum_e z_e$,应是第一种情况)。我们取节点$w$为子树$g$中深度最大且$\mathit{size}(w) \geq 2$的节点。
2.1. 若$k+2\mathit{depth}(w) \leq R(T)$,则
2.1.1. 若$w$有两个以上儿子,任取其中两个儿子$u$和$v$,则它们都是叶子节点。考虑将这两个节点进行匹配并且从树中删除,设删除$u$和$v$两个叶子节点之后的树为$T' = T_{u,v}$。此时,令$k' = k - \mathit{dis}(u, v) = k - \mathit{depth}(u) - \mathit{depth}(v) + 2\mathit{depth}(w) = k-2$。
2.1.2. 否则,$w$恰好有一个儿子$u$。考虑将这两个节点进行匹配并且从树中删除,设删除$u$和$v$两个叶子节点之后的树为$T' = T_{w,u}$。此时,令$k' = k - \mathit{dis}(w, u) = k - \mathit{depth}(w) - \mathit{depth}(v) + 2\mathit{depth}(w) = k-1$。
我们注意到,两种情况得到的树$T'$的重心仍然是$G$,并且问题化为节点数为$n' = n-2 = 2m-2$的问题,此时$k' \leq R(T')$。另一方面,
2.1.1. $L(T') = L(T) - 2$;
2.1.2. $L(T') = L(T) - 1$。
因此,$L(T') \leq k' \leq R(T')$且易证$L(T') \equiv k' \pmod 2$。根据归纳假设,存在树$T'$上的完全匹配$f'$,使得$S_{T'}(f') = k'$。
2.1.1. $f = f' \cup \{(u, v)\}$;
2.1.2. $f = f' \cup \{(w, u)\}$。
即得$S_T(f) = k$。
2.2. 否则,必存在一个子树$g$中的非叶节点$u$,使得$k+2\mathit{depth}(u) = R(T)$。选取节点$u$的一个儿子$v$,并匹配$u$和$v$。对剩下的节点,我们求出它们的DFS序,并按照 Case 1 的方式应用移位技巧即可。
结论:命题成立。
现在考虑如何构造出具体的完全匹配。在归纳法证明中,Case 1 和 Case 2.2 是直接的;Case 2.1 中,由于每次删掉的两个节点不会影响树的结构(甚至重心不变),我们可以以重心为根建树模拟即可。时间复杂度为$O(n)$。