杂题选做-5

#41 P14461

题目传送门

首先,我们注意到原 \(F,G\) 的转移是相对独立的,于是我们分开讨论。我们先手玩一下,看随着变换过程,\(f_i\) 怎么变。

然后发现第 \(k\) 项都形如 \(\prod \limits_{j=1}^k(i+j)\times f_{i+k}\)

然后,我们观察系数,发现在 \(2j\) 次时,系数都形如 \(\binom{i}{j}\)\((-1)^i\) 的乘积。

然后就直接算就完了。

#42 ARC118E

题目传送门

首先,这类题目有一个很明显的特征:如果确定状态求答案简单,但是时间复杂度不支持枚举

那么这时候就需要考虑边转移边维护容斥系数。

我们记 \(f_{x,y,k,a,b}\) 表示已经到 \((x,y)\) 且已经经过了 \(k\) 钦定的障碍点,且当前行有(没有)确定的障碍点,当前列有(没有)确定的障碍点。

初始有 \(f_{0,0,0,1,1}=1\),因为需要保证第 \(0\) 行和第 \(0\) 列没有被钦定的点。

那么我们考虑转移:

  • \((x,y)\) 是一个确定的障碍点:那么不转移;

  • 如果不是:

    • \(x \le n\)

      • 不钦定 \((x,y)\) 为障碍点:\(f_{x+1,y,k,a_{x+1},b} \leftarrow f_{x,y,k,a,b}\)
      • 钦定 \((x,y)\) 为障碍点:\(f_{x+1,y,k+1,a_{x+1},1} \leftarrow f_{x,y,k,a,b}\)
    • \(y \le n\):类似,不赘述。

最后我们假设 \(m\) 为初始时 \(-1\) 的数量,那么答案为:

\[\sum_{i=0}^m(-1)^if_{n+1,n+1,i,0,0}\times (m-i)! \]

最后一项是因为没有钦定的位置可以任选。

#43 CF1608F

题目传送门

首先,让我们想一想 \(O(n^3k^2)\) 的算法。

一个不那么简单的状态:记 \(f_{i,j,l}\) 表示已经考虑了前 \(i\) 个数,且此时 \(mex=b_i+j\),并且有 \(l\) 个位置上的值大于 \(mex\)

因为 \(mex\) 不降,所以有 \(b_i+h \ge b_{i-1}+j\)

我们分类讨论,当前位置填什么:

  • \(b_i+h=b_{i-1}+j\)

    • \(a_i < b_i+h\) :那么有 \(f_{i,j,l} \leftarrow f_{i-1,j,l}(b_{i-1}+j)\);
    • \(a_i > b_i+h\):那么有 \(f_{i,j,l+1} \leftarrow f_{i-1,j,l}\)
  • \(b_i+h > b_{i-1}+j\):那么此时 \(a_i\) 只能填 \(b_{i-1}+j+1\),但是此时那 \(l\) 个位置就可能有用了。

    我们来一点铺垫:我们记 \(F(x,n)\) 表示在长度为 \(x\),值域为 \([1,m]\) 的序列中,使得\([1,m]\) 的每一个数都在序列中出现过一次的方案数。

    那么我们不那么简单地容斥一下 ,得到:

    \[F(n,m)=\sum_{k=0}^m(-1)^k\binom{m}{k}(m-k)^x \]

    就是枚举钦定未出现的数的个数,然后求方案数。

​ 那么我们枚举有 \(x\) 个原来在 \(l\) 中的位置现在 \(< mex\),且新的 \(mex=h+b_i\),转移就是:

\[f_{i,h,l-x} \leftarrow f_{i-1,j,l}\binom{l}{x}F(x,h+b_i-(h_{i-1}+j)-1) \]

接下来考虑优化:我们注意到复杂度主要在于枚举 \(x\)\(h\)。我们注意到 \(h\) 是一段固定的数。于是考虑优化状态。

我们设 \(f_{i,j,l}\) 表示考虑了前 \(i\) 个数,且 \(mex\)\(j\),且其中大于 \(mex\) 数中不同的数有 \(l\) 个的方案数。设 \(i-1\) 时的 \(mex\)\(x\)

  • \(x<j\):那么 \(a_i=j\),此时只需要在前面 \(l\) 个不同的数中选出 \(j-x-1\) 使其交集包含 \((x,j)\) 即可:

    \[f_{i,j,l}\leftarrow f_{i-1,x,l+(j-x-1)}\binom{l+(j-x-1)}{j-x-1}(j-x-1)! \]

    其中乘 \((j-x-1)!\) 是因为这 \(j-x-1\) 个数的顺序是重要的。

  • \(x=j\):那么 \(a_i\) 有三种取法:取 \([0,j)\) 内的数,取前 \(l\) 个数中的一个,取大于 \(j\) 的数中不在那 \(l\) 个中的一个。

    \[f_{i,j,l}=jf_{i-1,j,l}+lf_{i-1,j,l}+f_{i-1,j,l-1} \]

答案就是:

\[\sum_{x=b_n-k}^{b_n+k}\sum_{i=0}^{n-x}\binom{n-x}{i}f_{n,x,i}i! \]

这么做时间复杂度是 \(O(n^2k^2)\) 的,因为我们还是要枚举 \(x\)

考虑优化,注意到第一个转移的系数:

\[\binom{l+(j-x-1)}{j-x-1}(j-x-1)!=\dfrac{1}{l!}((l+j-1)-x))! \]

于是我们用 \(g_{i,mx,m}\) 进行第一种转移的预处理:

\[g_{i,mx,m}=\sum_{j\le mx}f_{i,j,m-j}(m-j)! \]

那么操作之后转移简化为:

\[f_{i,j,l}=\dfrac{g_{i-1,j-1,j+l-1}}{l!}+jf_{i-1,j,l}+lf_{i-1,j,l}+f_{i-1,j,l-1} \]

时间复杂度为 \(O(n^2k)\)

#44 P10833

题目传送门

注意到 \(1\) 必须出现在区间内,我们以每一个 \(1\) 为分界点把原序列分成如果段。

考虑一个 \(1\) 的左右两段,我们枚举左边的段的一个后缀,那么根据最大值可以唯一确定右边段的长度,直接 \(O(1)\) 判断即可。判断可以通过如下操作实现:给每一个数随机赋权,然后求序列上和值域上的前缀异或和,然后就可以实现 \(O(1)\) 判断。

因为每一个位置只会被枚举两次,时间复杂度为 \(O(n)\)

#45 CF932F

题目传送门

\(f_i\)\(i\) 点的答案,那么转移为:\(f_{u}=\min \limits_{v \in subtree(u)}f_v+a_ub_v\)

注意到转移类似一次函数,直接斜优。

因为转移只来自子树内的点,有两个方向:李超树合并和树上启发式合并。

#46 CF2041H

题目传送门

首先,容易发现题目要计数的东西和序列元素具体是什么没关系,只和相邻元素之间的偏序关系有关系。

然后,因为 = 号可以随便放,所以我们最后再考虑。接下来就是处理只有 <> 的合法序列个数即可。

因为使合法序列尽可能多,我们考虑每一次放 < 时,都尽可能贴着值域上界放;每一次放 > 时,都尽可能贴着值域下界放。于是我们可以得到序列合法的条件为:没有长度不小于 \(k\) 的相同符号连续段。

我们令 \(f_i\) 表示长度为 \(i\) 的合法序列方案数,转移就是 \(f_i=\sum \limits_{\max(i-k,0)<j<i}f_j\)。显然可以前缀和优化。

方案数就是 \(\sum \limits_i \binom{n}{i}f_i\)

#47 P14508

题目传送门

首先,转移距离有限制很烦,我们考虑跑一个 dj 把所有可以通过若干步表示的转移距离及其最小代价求出,记为 \(d_j\)

然后,我们发现在当前在哪个位置是不重要的,重要的是当前可能有答案的区间长度。

我们令 \(f_i\) 表示待确定区间长度为 \(i\) 时的最小代价,有转移:

\[f_i=\min \limits_{1\le j \le i-1} (f_{i-j}+d_j) \]

注意到当 \(j \ge \max \limits_i a_i\) 时: \(j\) 一定是由两步凑出来的;因此我们只需要枚举到 \(\max a_i\) 即可,时间复杂度为 \(O(m(n+m))\)

#48 CF2028E

题目传送门

首先,我们考虑如果是 Alice 操作,那么它一定往上走;如果是女王操作,她一定往距离叶子节点最近的节点走。

那我们不妨简化一下模型:在一条以 \(1\) 为链顶的链上,求链上每一个点的逃出概率。

\[\begin{cases} f_1&=1\\ f_2&=\dfrac{1}{2}f_1+\dfrac{1}{2}f_3\\ f_3&=\dfrac{1}{2}f_2+\dfrac{1}{2}f_4\\ \cdots\\ f_{n-1}&=\dfrac{1}{2}f_{n-2}+\dfrac{1}{2}f_n\\ f_n&=0 \end{cases} \]

然后,我们考虑从后往前带入,得到:

\[\begin{cases} f_1&=1\\ f_2&=\dfrac{n-1}{n}f_1\\ f_3&=\dfrac{n-2}{n-1}f_2&=\dfrac{n-2}{n}f_1\\ \cdots\\ f_{n-1}&=\dfrac{1}{2}f_{n-2}&=\dfrac{1}{n}f_1\\ f_n&=0 \end{cases} \]

那么我们只需要做一个类似“短链剖分”的东西即可。

#49 P7114

题目传送门

首先,自然地,我们会想枚举循环节的长度 \(i\)。然后我们对 \(S\) 求一个 Z 函数,我们分析得到:长度为 \(i\) 的循环节可以出现 \(\lfloor \dfrac{Z_i}{i} \rfloor+1\) 次。(考虑用 \(i\) 不断去填长度为 \(Z_i\) 的 LCP 部分)我们记其中的偶数数量为 \(t_{i,0}\),奇数数量为 \(t_{i,1}\)

然后我们要考虑 \(A\)\(C\) 的限制。我们有一个观察:循环节出现每多出现两次,对每个字符的出现次数的奇偶性不影响。所以我们对循环节出现次数的奇偶性进行分讨(为了方便,下文记 \(f(l,r)\)\([l,r]\) 内出现次数为奇数的字符个数):

  • 若出现奇数次:那么合法前缀需满足 \(f(0,j)\le f(i+1,n-1)\),记合法前缀数量为 \(c_{i,1}\),则对答案贡献为 \(c_{i,1} \times t_{i,1}\)

  • 若出现偶数次:那么合法前缀需满足 \(f(0,j) \le f(0,n-1)\),记合法前缀数量为 \(c_{i,0}\),则对答案贡献为 \(c_{i,0} \times t_{i,0}\)

用树状数组维护"每一个出现次数为奇数的字符个数的前缀个数",时间复杂度为 \(O(n \log |\Sigma|)\)

#50 P9870

题目传送门

考虑 \(f\)\(g\) 之间的特殊性质,表示对于任意 \(i\)\(f_i\)\(g_i\) 的偏序关系相同。不失一般性地,我们钦定 \(\forall_{1 \le i \le n},f_i < g_i\)

首先,考虑朴素 dp。记 \(f_{i,j}\) 表示 \(X\) 已经匹配到 \(i\),且 \(Y\) 已经匹配到 \(j\) 是否可行。转移有 \(f_{i,j}=[x_i < y_j]\times (f_{i-1,j} \cup f_{i-1,j-1} \cup f_{i,j-1})\)。注意到这个形式和从 \((1,1)\) 走到 \((n,m)\) 且每一次只能向下,向左,向左下走一步,且每次必须保证 \(x_i < y_j\) 是一样的。

分析一下无解情况:如果 \(x_{max} \ge y_{max}\) 那么必定无解,因为 \(x_{max}\) 那一列一定都不可以走;类似地,如果 \(x_{min} \ge y_{min}\) 也不行。

然后观察特殊性质。记 \(a_{i,j}\) 表示 \((i,j)\) 的可达性,观察到:特殊性质就是说明 \(\forall_{1 \le i \le n}a_{i,m}=1\)\(\forall_{1 \le i \le m}a_{n,i}=1\)

那么也就是说只需要走到第 \((n-1)\) 行或第 \((m-1)\) 列就一定有解,此时问题规模缩小,引导我们想到递归。记此时已经递归到 \((x,y)\) 表示只要第 \(x\) 行或第 \(y\) 列就一定有解。转移分行和列,以行上为例:看在 \([1,x-1]\) 中是否有 \(x_{min} < y_{min}\) 如果存在,记 \(x_j=x_{min}\),那么即转移到\((j,y)\) 即可。如果存在某一时刻无法转移,那么必然无解。

考虑没有特殊性质。注意到此时我们还是可以从上述位置进行递归,只不过此时需要分别往 \((1,1)\)\((n,m)\) 各做一次。

时间复杂度为 \(O(q(n+m))\)

posted @ 2025-11-11 13:36  XiaoZi_qwq  阅读(8)  评论(0)    收藏  举报