【2022 NOIP 模拟赛 8】C. 退休计划 II 做题记录

给定 NN 个点和 MM 条边的连通图,求一条简单路径 pathpath 和两个点集 s1s1s2s2,满足:

  • s1=s2|s1| = |s2|,两个点集大小相同(可以为空);
  • s1+s2+path=N|s1| + |s2| + |path| = Ns1s2=s1 \cap s2 = \varnothings1path=s1 \cap path = \varnothings2path=s2 \cap path = \varnothing,即两个点集和简单路径恰好覆盖了所有点;
  • s1s1s2s2 之间没有边直接相连。

或者宣称这样的方案不存在。

1N,M2×1051\le N,M\le 2\times 10^5

一眼 dfs 树,然后考虑在树上构造。

根本不会无解。

显然根节点 rtrt 一定要让公主占领,然后若根节点 rtrt 的儿子的子树恰好可以分给两个王子使得满足条件,那么公主选根节点,根节点的儿子子树平均分给两个王子就行。

否则考虑递归构造,设当前两个王子分别占领了 sum0sum0 个点和 sum1sum1 个点,那么不难想到一个策略:

  • 先让公主占领 rtrt
  • 遍历 rtrt 除重儿子 hsonhson 之外的儿子 vv,若 sum0<sum1sum0<sum1,那么 vv 的子树分配给第一个王子,否则分配给第二个王子;
  • 若分配完之后 sum0sum1=sizhson|sum0-sum1|=siz_{hson} 那么构造完成,否则此时一定有 sum0sum1<sizhson|sum0-sum1|<siz_{hson},那么递归构造 hsonhson 的子树。