Loading

5.15 CW 模拟赛 T4. 拓扑

前言

总是要知道题解只是辅助

思路

考虑这个图的性质
首先一个组形如
pEjOqgK.png

考虑其性质
注意到大概是把剩下的组都挂到了 \(1\) 组上, 考虑对 \(1\) 组进行处理, 顺带处理其他组
这里有一个观察是, 第一行选的个数时刻大于等于第二行选的个数

不妨设 \(f_{i, j}\) 表示第一行选了 \(i\) 个, 第二行选了 \(j\) 个的方案数

  • \(f_{i, j} \to f_{i + 1, j}\)
    • \(i = j\)
      会解锁第 \(i + 1\)
      需要注意的是, 这次解锁之前, 是可以任意选一点 \(i + 1\) 组的第一行的, 这个时候选的点位置是固定的, 一定要在 \(j\) 之后 \(i\) 之前预留几个位置
      然后在后面选择若干个位置任意合法排列即可, 第一行已经选了若干之后的合法排列数显然是好计算的
    • \(i > j\)
      什么也不能解锁
  • \(f_{i, j} \to f_{i, j + 1}\)
    • \(j < i - 1\)
      会解锁第 \(j + 1 - n\) 组, 会注意到解锁后第一组对它没有任何约束了, 在后面任意选择 \(2n\) 个位置任意合法排列即可
      合法排列数显然是好计算的
    • \(i - 1 \leq j < i\)
      可以解锁一些第一排, 但是这个贡献放到后面

不难处理 \(g_{i, j}\) 表示第一行选了 \(i\) 个, 第二行选了 \(j\) 个的单组方案数
具体的

\[g_{i, j} \gets g_{i + 1, j} + g_{i, j + 1} \\ \]

其中 \(g_{n, n} = 1\)
注意 \(i < j\) 时不合法设为 \(0\)

带入 \(f\) 的转移中即可
因为 \(\mathcal{O} (n)\) 转移出现 \(\mathcal{O} (1)\) 次, \(\mathcal{O} (1)\) 转移出现 \(\mathcal{O} (n)\) 次, 所以一轮复杂度 \(\mathcal{O} (n)\), 总复杂度 \(\mathcal{O} (n^2)\)

总结

特殊类问题用一般问题优化

中间有一个子问题很经典:
我知道后面有「多少个」位置被占用, 那么我可以分阶段考虑, 在每个阶段处理剩下的位置中选择即可
也就是之前总结的: 整体等概率一般可以拆成每一次均匀选择

提一嘴无关的, 事实上所谓多重集排列可以被拆成

\[ \begin{align*} & \prod_{i = 1}^{k} {n - \sum_{j = 1}^{i - 1} s_j \choose s_i} \\ =& \prod_{i = 1}^{k} \frac{\left(n - \sum_{j=1}^{i-1} s_j\right)!}{s_i! \cdot \left(n - \sum_{j=1}^i s_j\right)!} \end{align*} \]

好笑

posted @ 2025-05-16 11:03  Yorg  阅读(13)  评论(0)    收藏  举报