CF1085 G. Beautiful Matrix
题目大意:
定义一个 \(n \times n\) 的矩阵是美丽的,当且仅当:
- 它每行都是个排列
- 上下相邻的数字一定不一样。
现在给定一个漂亮的 \(n \times n\) 矩阵 \(A\),现在问有多少字典序小于 \(A\) 的漂亮的矩阵。
矩阵的字典序在此题中比较方式:行从上到下,然后同行是从左到右。
\(1 \le n \le 2000\)
解题思路:
考虑枚举 \(A,B\) 中第一个不同的位置,设其为 \(x,y\)。
那么 \(x + 1 \sim n\) 行是简单的,则为 \(n\) 的错排个数的 \(n-x\) 次方。
而 \((x, y) \sim (x, n)\) 这些数,他们既要保证与 \(a_{x,1} \sim a_{x, y - 1}\) 不同,还要与上一行的对应位置不同。
简化一下条件,发现这些数的答案只跟 \(n - y\) 和 \((a_{x - 1, y + 1} \sim a_{x - 1, n}) \cap (S - b_{x, 1} \sim b_{x,y})\) 的大小有关。
当然还有 \(b_{x,y}\) 自身的一些条件,有 3 个限制。
其中 \(S\) 为 \(1 \sim n\) 的集合。
那么设上面的两个分别为 \(len,cnt\),答案就是相当于有多少长度为 \(len\) 的排列,且恰好有 \(len\) 个 \(p_{i} \ne i\)。
设 \(dp_{i,j}\) 表示有多少为 \(i\) 的排列使得恰好有 \(j\) 个 \(p_{k} \ne k\)。
然后我就不会了。
首先考虑个简单的情况 \(i = j\),那么 \(dp_{i,i} = (n-1) \times (dp_{i - 1, i - 1} + dp_{i - 2, i - 2})\)。
因为考虑 \(i\) 这个位置放有 \(i - 1\) 种方案数,设填在 \(i\) 这个位置的为 \(j\)。
若第 \(j\) 个位置填了 \(i\),那么剩下 \(i - 2\) 个随便填,方案数为 \(dp_{i - 2, i - 2}\)。
若第 \(j\) 个位置不填 \(i\),那么可以将第 \(i\) 个位置看为第 \(j\) 个位置(反正强定第 \(j\) 个位置不为 \(i\)),方案数为 \(dp_{i - 1, i - 1}\)。
那么当 \(i > j\) 时,我们可以强定前 \(j\) 个位置 \(p_{k} \ne k\),后面随意。
那么若第 \(i\) 个位置是填的 \(1 \sim j\) 中的数,那么设为 \(k\),则 \(p_{k}\) 永远不能等于 \(k\) 了,相当于这条限制消掉了,所以方案数是 \(dp_{i - 1, j - 1}\)。
若第 \(i\) 个位置填的是 \(j + 1 \sim i\) 中的数,那么与前 \(j\) 个无关,方案数为 \(dp_{i - 1, j}\)。
所以
dp 搞完了,回到原问题。
如果 \(b_{x,y}\) 确定了,那么 cnt 只需在从左往右扫的时候拿两个桶记录就行。
可是 \(b_{x,y} < a_{x,y}\),先把固定的 \((a_{x - 1, y + 1} \sim a_{x - 1, n}) \cap (S - b_{x, 1} \sim b_{x,y - 1}) = cnt'\) 算出来,那么我们假设它是 \(c\),则一定有 \(c \notin (a_{x,1} \sim a_{x,y - 1})\)。
若 \(c \notin (a_{x - 1, y + 1} \sim a_{x - 1, n})\),那么 \(cnt = cnt'\)。
若 \(c \in (a_{x - 1, y + 1} \sim a_{x - 1, n})\),那么 \(cnt = cnt' + 1\)。
所以我们维护两个 BIT 就能算出两种情况的个数。
\(O(n^2 \log n)\)。
一些很经典的式子,就比如错排的递推求法还是要学习一下的。

浙公网安备 33010602011771号