CF1909F2 题解

· · 题解

感觉这个题还是挺不错的。

考虑 F1。考察 a_i 差分后的意义,发现 a_i - a_{i - 1} 就是 (\sum\limits_{j = 1}^{i - 1} [p_j = i]) + p_i \le i

考虑将其转化为棋盘问题。在 (i, p_i) 放一个车,那么 a_i - a_{i - 1} 就是 (1, i) \sim (i, i)(i, 1) \sim (i, i - 1) 这些格子组成的“L”字形的车的数量。

一个放车的方案合法当且仅当所有车互不攻击。因此容易发现合法的 a_i - a_{i - 1} 一定 \in [0, 2]。考虑从前往后扫,同时维护答案 ans 和现在还没被占用的行(列)数量 t

如上讨论可以通过 F1。

F2 我们继续将其放到棋盘上考虑。考虑一个 a_i \ne -1 的位置 i,设它上一个 a_j \ne -1 的位置是 j。现在相当于求在 y \times y 的左下角抠掉了 x \times x 的一块的“L”字形棋盘放 t 个互不攻击的车的方案数,其中 x = j - a_j, y = i - a_j, t = a_i - a_j。每个这样的“L”字形互相独立,所以可以直接把方案乘起来。

上面的问题可以考虑容斥(我现在还不会不容斥的做法?)。相当于在左下角 x \times x 的区域不能放车,那么我钦定 i 个车放在了左下角,设 F(n, m)n \times n 的棋盘放 m 个互不攻击的车的方案数,那么这部分的方案为 F(x, i) \times F(y - i, t - i),容斥系数为 (-1)^i,因此结果为:

\sum\limits_{i = 0}^t (-1)^i F(x, i) F(y - i, t - i)

最后一个问题是求 F(n, m)。考虑先选 m 行放车,有 \frac{n!}{(n - m)!} 种选列的方案,那么 F(n, m) = \binom{n}{m} \times \frac{n!}{(n - m)!}

容易发现 \sum t = n,所以时间复杂度为 O(n)

code