• [JOISC2020]遗迹


    同步自LOJ讨论。这个做法是我对官方示例代码进行逆向分析的结果,与周雨扬等大佬的做法差异较大。

    题目链接

    题意

    $2N$ 根柱子排成一行,依次编号为 $1, 2, ldots, 2N$, 其中高度为 $1, 2, ldots, N$ 的各 $2$ 根。进行 $N$ 轮操作,每次操作中,对于高度 $1, 2, ldots, N$, 该高度的柱子中编号最大的高度不变,其余的降低 $1$. 当柱子高度降低到 $0$ 时柱子被摧毁。已知操作结束后,哪些柱子没有被摧毁,求原高度的方案数。

    题解

    将石柱缩短的过程等价转换

    我们注意到,对于某一高度,最后会保留曾经为该高度的所有石柱中,编号最大的一根。

    因此我们设初始高度为 $i$ 的石柱编号为 $X_i < Y_i$; 最后保留的高度为 $k$ 的石柱为 $T_k$. 则求出 $T_n, T_{n-1}, ldots, T_1$ 的算法如下:

    算法一 给定初始局面,求出最后保留的石柱及其高度

    1. 令集合 $S=emptyset$.
    2. 对于 $i=n, n-1, ldots, 1$, 执行如下操作:
      1. $S gets S cup {X_i, Y_i}$.
      2. $T_i = max S$.
      3. $S gets S setminus {T_i}$.

    关于卡特兰数的引理

    我们先证明一个引理。

    引理:设卡特兰数 $h_n=frac{(2n)!}{n!(n+1)!}$, 则:

    $$h_{n+1}=sum_{2m le n}{n choose 2m}2^{n-2m}h_m$$

    证明:设 $g_n$ 为所有长度为 $n$ 的由括号组成的序列的合法子括号序列数之和。

    一方面,我们枚举是哪些位属于合法子括号序列,根据卡特兰数的意义容易得出,$g_n=sum_{2m le n}{n choose 2m}2^{n-2m}h_m$.

    另一方面,对于 $n in mathbb Z_+$, 考虑长度为 $n$ 的括号序列的最后一位是否含于括号序列内:若含,则这是一个右括号,考虑其对应的左括号,这对括号的严格内部有 $i$ 个字符,则它们构成一个 $i$ 个字符的括号序列的合法子括号序列;否则这可以是左括号也可以是右括号。

    因此 $g_n$ 有递推式:

    $$g_n=egin{cases}1,&n=0;\2G_{n-1}+sum_{i=0}^{n-2}G_iG_{n-2-i}&n>0.end{cases}$$

    把它写成生成函数的形式,即 $G(x)=1+2xG(x)+x^2G^2(x)$, 解得

    $$G(x)=frac{1-2x - sqrt{1-4x}}{2x^2}$$

    其中规定 $sqrt{1-4x}$ 的常数项为 $1$.

    因此

    $$xG(x)+1=frac{1-sqrt{1-4x}}{2x}$$

    即 $xG(x)+1$ 为卡特兰数的生成函数。故 $g_n=h_{n+1}$.

    引理证毕!

    $T_1=n+1$ 的情况数

    算法一中,当 $i=1$ 时,在步骤2.2中集合 $S={1, 2, ldots, 2n} setminus {T_2, T_3, ldots, T_n}$. 由于正整数集合 $S$ 的大小为 $n+1$, 所以 $T_1=max S>n$, 进一步地我们得出 $T_1=n+1$ 可等价于 $T_2, T_3, ldots, T_n ge n+2$. 我们考虑集合 $S$ 与 ${n+2, ldots, 2n}$ 的交集 $S'$. 我们需要保持除了 $i=1$ 时以外,在每个步骤2.2中,$S'$ 均非空。

    我们发现,若 $X_i < n+2 le Y_i$, 则 $|S'|$ 不变,我们记 $a_i=0$; 若 $Y_i < n+2$, 则 $|S'|$ 减少 $1$, 记 $a_i=-1$; 若 $X_i ge n+2$, 则 $|S'|$ 增加 $1$, 记 $a_i=1$. 假设 $a_i=-1$ 的有 $m$ 个,则 $a_i=1$ 的也有 $m$ 个。

    那么在步骤2.2中 $S'$ 非空就等价于 $forall 2 le i le n, sum_{j=i}^na_j ge 0$. 在确定一种 ${a_i}_{i=2}^{n}$ 序列后,我们按照它的指导来分配 $X_i, Y_i$.

    对于 $n+2$ 至 $2n$, 就是把原先代管在这一侧的石柱的初始高度任意分配,但是其中有 $m$ 对位置高度相同,于是这里的方案数是 $2^{-m}(n-1)!$.

    对于 $1$ 至 $n+1$, 还要补上 $X_1, Y_1$, 于是这里的方案数是 $2^{-m-1}(n+1)!$.

    综上可得,$T_1=n+1$ 的情况数为:

    $$sum_{2m le n}(n+1)!(n-1)!{n-1 choose 2m}2^{-2m-1}h_m=(n+1)!(n-1)!2^{-n}h_n=(n-1)!frac{(2n)!}{n!2^n}=(n-1)!(2n-1)!!$$

    事实上通过打表我们发现一个有趣的性质:$T_1$ 取 $n+1, n+2, ldots, 2n$ 的机会是均等的。这也说明了可能有更优美的证明方法,还请组合计数大佬们赐教>_<

    对残存石柱的最终高度序列DP

    设第 $i$ 个残存石柱(也就是位置 $A_i$)的高度为 $p_i$, 换句话说说,$T_{p_i}=A_i$. 我们考虑 $p_1, p_2, ldots, p_n$ 的前缀最小值的性质。

    假设 $p_k=min{p_1, p_2, ldots, p_k}$. 当算法一的 $i=p_k$ 循环结束时,可得 $max S < A_k$. 由于最终高度小于 $p_k$ 的所有残存石柱编号都大于 $A_k$, 所以此后 $S$ 将始终包含当前的 $S$, 也就是当前的 $S$ 所含石柱最终全部被摧毁。

    注意到,初始高度不小于 $p_i$ 的石柱中,各有 $(n-p_i+1)$ 根石柱最终残存或被摧毁。于是设 $n-p_i+1=j$.

    假设对于所有 $min{p_1, p_2, ldots, p_i}=n-j+1$ 的情况,考虑确定初始高度不小于 $n-j+1$, 但最终被摧毁的石柱的位置和初始高度,及前 $i$ 根残存石柱的初始原高度的方案数,记作 $f(i, j)$.

    设 $min{p_1, p_2, ldots, p_{i-1}}=n-j+1$, 若 $i=1$ 则设 $j=0$.

    如果 $p_i < n-j+1$ 是前缀最小值,设 $p_i=n-j-k+1$. 那么它会新带进来一些原高度介于区间 $[n-j-k+1, n-j+1)$ 的石柱。我们为最终被摧毁的石柱确定位置和高度,位置的方案数好算,这些位置从在 $A_i$ 左边且没有被占领的位置里任选,所以方案数是 $A_i-i-j choose k$. 被摧毁的石柱的原高度不好考虑,我们考虑联合那些原高度介于区间 $[n-j-k+1, n-j+1)$ 的残存石柱一并计算,根据定义它们在 $A_i$ 右边。那么这就变成了,当原问题规模为 $k$ 时,求 $T_1=k+1$ 的方案数,它是 $(k-1)!(2k-1)!!$. 右边的残存石柱如何调换顺序都不会对 $T_1$ 造成影响,所以欲去掉它们的影响只需要除以 $(k-1)!$. 因此这种情况的转移式用主动转移可写为 $f(i, j+k) overset+gets f(i-1, j){A_i-i-j choose k}(2k-1)!!$.

    如果 $p_i ge n-j+1$, 那么它的原高度已经在前头的DP中预留好了,只需要从 $j-i+1$ 种原高度里任选一种就好。因此这种情况的转移式是 $f(i, j) overset+gets (j-i+1)f(i-1, j)$.

    综上,我们得到了一个小常数 $O(n^3)$ 时间的算法。

    代码链接

  • 相关阅读:
    数据库表设计--备份记录的表设计优化
    WINDOWS CLUSTER -- 时间不同步导致的群集问题
    SQL Server--存在则更新问题
    MySQL--Ansible推送密钥实现免密码登录
    我命由我不由天
    hive中同源多重insert写法
    单文件数据库
    NTP时钟同步配置
    SQL中左连接on and条件和where条件执行先后顺序
    maven引入CDH依赖包
  • 原文地址:https://www.cnblogs.com/nealchen/p/12735945.html
Copyright © 2020-2023  润新知