ABC313Ex 题解

· · 题解

考虑若重排好了 a,如何判断可不可行。显然只用把 b 排序,把 \min(a_{i - 1}, a_i) 也排序(定义 a_0 = a_{n + 1} = +\infty),按顺序逐个判断是否大于即可。

这启示我们将 \min(a_{i - 1}, a_i) 排序考虑。考虑从大到小加入 a_i,那么加入一个 a_i,和它相邻的 \min(a_{i - 1}, a_i) 一定是 a_i。每个时刻已经加入的 a_i 形成了若干个连续段,考虑连续段 dp:

f_{i, j} 为考虑了 a 中前 i 大的数,当前形成了 j 个连续段。那么有 i - j 对相邻的数。

初值为 f_{2, 2} = 1,表示一开始加入了 a_0a_{n + 1}

有转移:

答案为 f_{n + 2, 1}

时间复杂度 O(n^2)

code