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}\) 数
1. type 0
没有任何限制,那就直接排列组合。
设横向走了 \(2i\) 步(有去有回),则纵向就走了 \(n - 2i\) 步。
横着走的 \(2i\) 步是从 \(n\) 步里随机挑出来的,共有 \(\dbinom{2i}{n}\) 种方案。
这 \(2i\) 步里有向左走的也有向右走的,挑出向左走的方案数为 \(\dbinom{i}{2i}\)。
同理,纵向移动的方案数为 \(\dbinom{\frac{n - 2i}{2}}{n-2i}\)。
根据乘法原理
2. type 1
纯纯的卡特兰数定义,只能在负半轴上走,并且还得回到原点。
即 \(n\) 个 \(+1\) 和 \(n\) 个 \(-1\) 的前缀和小于等于 \(0\) 的方案数,就是卡特兰数。
下面式子的 \(n\) 是 \(\dfrac{n}{2}\),答案为
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}\))。
答案为
D. DP搬运工 1
咕