还是比较小清新的一道题?我甚至找不到合适的标签(
显然终止条件就是所有边连向 n,最优策略也是每次把一条边连向 n。
所以最少次数就是开始时不与 n 相连的边的条数。
那么把和 n 相连的点(包括 1,n−1)排序后,取相邻的两个点 l,r,则必然存在,且仅存在一个点 mid∈(l,r) 与 l,r 都相连。
那么如果进行了 (l,r)「旋转」便相当于把 (l,r) 拆成了 (l,mid),(mid,r)。
然后这样就能建出一片二叉树森林,方案数便是合并左右儿子的贡献,组合数算一下就行了。
考虑在此基础上再进行一次 (a,b)「旋转」操作会有什么情况:
- (a,b) 不是某棵二叉树的根。
那么这次操作并不是最优策略,不会影响步数。 而在二叉树上,相当于把 (a,b) 对应的点进行一次类似平衡树的旋转操作。
注意到 a<b,并且 a 一定和 n 相连(若 a,b 都不与 n 相连则不合法),所以 (a,b) 一定是左儿子。
计算此对答案的修改量并不难。 - (a,b) 是某棵二叉树的根。 那么这会使步数减少一,并把一棵二叉树的根的左右子树拆开。
这也不难计算。
代码:
1 |
|