CSP模拟1

A. 随

咕咕咕

B. 单

  • \(\text{test} \ 1\):边差分,\(O(n^2 \log n)\)
  • \(\text{test} \ 2 \sim 4\)\(O(n)\) 预处理距离,高斯消元

考场准备拿 \(\text{40 pts}\) 走人,结果高斯消元脑抽中间用了 double,后来转 int 的时候精度出了问题,又挂了 \(\text{20 pts}\)

C. 题

前置芝士:\(\text{Catalan}\)

\[C_n = \dfrac{1}{n+1}\dbinom{n}{2n} \]

1. type 0

没有任何限制,那就直接排列组合。

设横向走了 \(2i\) 步(有去有回),则纵向就走了 \(n - 2i\) 步。

横着走的 \(2i\) 步是从 \(n\) 步里随机挑出来的,共有 \(\dbinom{2i}{n}\) 种方案。

\(2i\) 步里有向左走的也有向右走的,挑出向左走的方案数为 \(\dbinom{i}{2i}\)

同理,纵向移动的方案数为 \(\dbinom{\frac{n - 2i}{2}}{n-2i}\)

根据乘法原理

\[\sum_{i = 0}^{\frac{n}{2}}\dbinom{2i}{n}\dbinom{i}{2i}\dbinom{\frac{n - 2i}{2}}{n-2i} \]

2. type 1

纯纯的卡特兰数定义,只能在负半轴上走,并且还得回到原点。

\(n\)\(+1\)\(n\)\(-1\) 的前缀和小于等于 \(0\) 的方案数,就是卡特兰数。

下面式子的 \(n\)\(\dfrac{n}{2}\),答案为

\[\dfrac{1}{n+1}\dbinom{n}{2n} \]

3. type 2

\(f[i]\) 表示走了 \(i\) 步回到原点的方案数,枚举第一次回到原点的方案数 \(j\)\(j\) 为偶数),则此时方案数为 \(4 \times f[i - j] \times Cat_{\frac{j}{2} - 1}\)

为什么要 \(-1\)

卡特兰数是大于等于 \(0\),但我们显然不需要这个等于。

假设只在横轴上移动,设向正方向走为 \((\),向负方向走为 \()\)

那么我们可以用括号序列来模拟移动的过程。

像这个序列 \((())(())\) 移动中也经过了一次原点,但是这个答案在 \((())\) 就被记录。

\(-1\) 的意义就是在序列两端人为加一对括号,保证在一次 \(dp\) 中不会中途回到原点。

还要考虑总共四个方向。

4. type 3

只能在第一象限和坐标轴正半轴走,有点像卡特兰数的经典例题。

要同时保证纵向和横向走的方案都满足卡特兰数的性质,还是枚举横向走 \(2i\) 步,则纵向走 \(n - 2i\) 步。

那么对于每次枚举,方案数即为横向和纵向方案数的乘积,再乘上从 \(n\) 步中选出某些步数横向走的方案数(考场忘记了这个,挂了 \(\text{25 pts}\))。

答案为

\[\sum^{\frac{n}{2}}_{i = 0}\dbinom{2i}{n}Cat_{i}Cat_{\frac{n - 2i}{2}} \]


D. DP搬运工 1

posted @ 2023-07-20 19:36  -白简-  阅读(25)  评论(0编辑  收藏  举报