杂题选做-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\) 的数量,那么答案为:
最后一项是因为没有钦定的位置可以任选。
#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\),转移就是:
接下来考虑优化:我们注意到复杂度主要在于枚举 \(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} \]
答案就是:
这么做时间复杂度是 \(O(n^2k^2)\) 的,因为我们还是要枚举 \(x\)。
考虑优化,注意到第一个转移的系数:
于是我们用 \(g_{i,mx,m}\) 进行第一种转移的预处理:
那么操作之后转移简化为:
时间复杂度为 \(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\) 时的最小代价,有转移:
注意到当 \(j \ge \max \limits_i a_i\) 时: \(j\) 一定是由两步凑出来的;因此我们只需要枚举到 \(\max a_i\) 即可,时间复杂度为 \(O(m(n+m))\)。
#48 CF2028E
首先,我们考虑如果是 Alice 操作,那么它一定往上走;如果是女王操作,她一定往距离叶子节点最近的节点走。
那我们不妨简化一下模型:在一条以 \(1\) 为链顶的链上,求链上每一个点的逃出概率。
然后,我们考虑从后往前带入,得到:
那么我们只需要做一个类似“短链剖分”的东西即可。
#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))\)。

浙公网安备 33010602011771号