ARC199C 题解
xuanxuan001 大神的题解写得不是很清晰,所以这里是一篇人话题解。
先手玩一下。随便写一个排列与一棵合法树:
很容易猜到,树是合法的,当且仅当:它的任意子树对应排列的标号是连续的。证明比较显然,必要性由题意易知,充分性只需要从下往上递归构造树即可。\(\square\)
这个说法并不严谨,因为这是一个环,可能出现连续段跨越环的情况。直接断环成链比较麻烦,但是发现对 \(P\) 进行一些整体加减对答案并没有影响,且排列相互之间没影响,所以可以调整 \(P_{i,1}=1\),并钦定 \(1\) 为根。
那么可以直接预处理出,每个区间 \([l,r]\) 是否可能构成子树,即是否在 \(m\) 个排列中的标号都连续。(为了方便,注意到对所有排列整体做置换也不影响答案,所以可以调整出 \(P_{1,i}=i\),这样标号就是连续的了)
然后直接区间 DP 就行。具体设 \(f_{l,r}\) 表示标号 \([l,r]\) 中的数构成的树个数,设其中根为 \(rt\),其有若干个儿子 \(v_1,v_2,\cdots,v_k\),就能把区间拆成 \([l,v_1)[v_1,v_2)\cdots[v_t,rt),\{rt\},(rt,v_{t+1})[v_{t+1},v_{t+2})\cdots[v_k,r]\)。于是增设 \(g_{l,r}\) 表示去除根后构成的树的个数,那么 \(f_{l,r}=g_{l,rt-1}g_{rt+1,r}\);\(g\) 再不断由 \(g,f\) 合并即可。简单来说就是模拟上面的区间拆分。
code,时间复杂度 \(O(n^2(n+m))\)。
回顾整道题,确实没啥难度,每一步都有很强的引导性,包没有 AT *3000 的......