2025.11 复习

· · 个人记录

我咋啥都不会。

\color{red}\text{P1117 优秀的拆分}

Problem

多测,每次给定 s,求 s 的所有子串的所有拆分中,有多少个是 \operatorname{AABB} 的形式。

T \le 10$,$n \le 3\times 10^4 1.5s, 512MB
Sol
$\operatorname{ABAB}$ 的形式比较好通过 $\operatorname{LCP \& LCS}$ 统计? 扩展:求区间复制串数 #### $\color{green}\text{P1186 玛丽卡}
Problem

求删边最短路。

n \le 1000$,$1\le m \le \frac{n(n+1)}{2} 1s, 128MB
Sol

先跑出一棵最短路树。然后只考虑 1 \leadsto n 的路径。对于不包含在这上面的边 (u, v),求出 1 \leadsto uv \leadsto n1 \leadsto n 这条路径上第一个离开/进入的点,记为 l, r,然后对 [l, r] 内的点 \operatorname{chkmax} 即可。

Q:可能有多条 1 \leadsto u 的最短路,选择的 l 是否会有问题?

A:不会。对于两个离开点 i, j,找到 i \leadsto u 的第一条边,我们对这条边算贡献的时候,就可以算对了。对于进入点同理。

\color{green}\text{P1852 跳跳棋}

Problem

给定 a, b, c, x, y, z。分别表示三颗珠子的初始位置和目标位置(珠子间相同)。每次可以遵循跳棋的规则进行一次操作。问是否可以达到,并求出最少步数。

值域 10^9

1s, 125MB
Sol

先判断是否合法,由于操作是可逆的,可以直接求出终态(2y=x+z)判断是否相等。

找最少步数我们难以找到一个类似于拐弯的地方。但是我们发现一个状态想要缩小的话只有一步,这是一个类似于树的结构,然后需要找的是 LCA。二分即可。时间复杂度是两个 \log

\color{red}\text{P2135 方块消除}

Problem

给定 n 个相邻的区域,每个区域有长度 l_i 和颜色。对相同颜色的长为 l 一段消除的代价为 l^2,求最大代价。

n \le 50, l_i \le 20 1s, 512MB
Sol

考虑区间 DP。

但是发现对于 111100001111 这种情况是难以处理的,因为正解应该是先消 0 再一起消 1。但是无法记录当前区间剩余段的长度&颜色(时空难以接受)。考虑简单的变一下,变为 f_{l, r, k} 表示消除了 [l, r + k]r\sim r+k 这一段同色)这一段的最大代价。

转移则直接扩展 k 或枚举断点(因为这样的话要消一定要)即可。

\color{blue}\text{P3286 [SCOI2014] 方伯伯的商场之旅}

Problem

对于一个 n 堆石子 p_{1..n},每次可以移动一堆石子到另一堆石子上,代价为距离乘石子数,令 p 的代价为其移成一堆的最小代价。

定义一个 p(x) 表示 xK 进制下每一位构成的序列。对 L \le x \le R,求出 p(x) 的代价和。

L \le R \le 10^{15}$,$2 \le K \le 20 1s, 125MB
Sol

最小代价是都移到中位数的位置。暴力的想法是枚举中位数的位置,但是这样会很麻烦,因为会有两个限制(L + x > RR + x > L),并且可能会有两个位置都有中位数。考虑一下这个东西的本质,就是类似于左右移导数均小于 0,由于和在 DP 的过程中是可计算的,因此可以直接使用这个东西来进行调整:先都移到 1,然后再枚举 1\to 22\to 3 等过程中减小的代价。

\color{green}\text{P3327 [SDOI2015] 约数个数和}

Problem

\sum_{i\le n} \sum_{j \le m} d(ij)

n, m \le 10^5 1s, 125MB
Sol

知道 d(ij) = \sum_{x|i, y|j} [x \perp y] 即可。证明这玩意可以直接把 i,j,ij 质因数分解后考虑。

\color{blue}\text{P3586 [POI 2015 R2] 物流 Logistics}

Problem

给定数组 a,每次单点修改。或给定 c, s,每次选出 c 个正数减一,问能否操作 s 次。询问的修改不会对序列造成真正的修改。

Sol

有一个比较简单的贪心,就是每次选择最大的 c 个,但是这样并不好维护。考虑把 a_i 填到次数里面去。由于 a_i \ge s 的时候只能填 s 次,先把这些数扔出去。把每一次选出的集合列成一行。则填入 a_i 的时候是从上到下扔进没有满的集合。然后你发现这个东西只需要判定,因此我可以直接把没有填满的列接着填而不是从上到下填(因为这时候一定不会产生重复)。于是只需要维护 a_i < s\sum a_ia_i \ge si 的数量。可以使用 BIT 维护。

\color{blue}\text{P11368 [Ynoi2024] After god}

Problem

有两个初始为 0 的序列 a_{1..n}b_{1..n},每次修改给定 x, y,表示 a_x \gets y,然后对 i = 1, \dots , nb_i 加上 \max_{j \le i} a_j,然后查询 \sum_{i \le x} b_i

n,m \le 10^6$,$1\le x,y \le n 2.5s, 512MB
Sol

你想对这个东西直接上历史和,但是失败了,因为 \operatorname{chkmax} 操作没法子拆。使用单侧递归的技巧是 2\log 的。想想这玩意求的实际上是什么:把 \max a 按时间从上到下拆开变为 c_{1..t, 1..n}。然后求和是 \sum_{i \le x, j \le t} c_{j, i},即矩形和。区间改值是一个上下左有边界的矩形 \operatorname{chkmax},我们直接历史和失败的原因是因为上下界均有限制并且没法差分。考虑换成从左到右扫描线(即交换求和顺序),于是就可以直接维护历史和做到线对了。

\color{green}\text{CF1342F Make It Ascending}

Problem

给定长为 n 的序列 a,每次可以把一个数合并到另一个数上,要求合并完后的序列单调递增,求出最小操作次数即方案。多测。

$7s, 500MB
Sol

直接的不是很好做,因为可能涉及到插入。直接对最后的序列 DP(按合并的位置的顺序),由于值域是很大的,因此把答案扔进状态:f_{i, j, S} 表示当前用了 i 个集合,第 i 个集合合并的位置在 j,用了 S 中的数的情况下最后一个子集的和的最小值。转移枚举超集,新的 j' 一定是 S 中合法的里面最小的。时间复杂度是 O(n^23^n)

trick:定义域和值域的交换。

\color{green}\text{P1251 餐巾计划问题}

Problem

总共 n 天,第 i 天需要 r_i 块餐巾。餐巾可以购买,或将用完的餐巾快洗或慢洗。三项操作每个餐巾分别花钱:p_1,p_2,p_3(递减的非负整数),三项操作花费时间 0,t_2,t_3(递增)天。用完的餐巾可以延期送洗,问满足每天要求的最小费用。

n\le 2000, 1 \le r_i \le 10^7, 1\le p_1, p_2, p_3 \le 10^4 4s, 125MB
Sol

对每天拆点为 (i_0, i_1)。令 (u, v, [l, r], p) 表示 u 连向 v,流量在 [l, r] 之间,费用为 c

连边:

对于 i \in [1, n],连边 (i_0, i_1, [r_i, r_i], 0)(i_0, (i+1)_0, [0, +\infin), 0)(0, i_0, [0, +\infin), p_1)(i_1, (i+t_2)_0, [0, +\infin), p_2)(i_1, (i+t_3)_0, [0, +\infin), p_3)(i_1, 0, [0, +\infin), 0)

然后求上下界无源汇最小费用可行流。

\color{green}\text{P1361 小M的作物}

Problem

小 M 现在有 n 种作物,第 i 种作物种植在 A 中种植可以获得 a_i 的收益,在 B 中种植可以获得 b_i 的收益,小 M 还找到了规则中共有 m 种作物组合,第 i 个组合中的作物共同种在 A 中可以获得 c_{1,i} 的额外收益,共同种在 B 中可以获得 c_{2,i} 的额外收益。

求最大种植收益。

2 \le n \le 10^3, 1 \le m \le 10^3 2s, 250MB
Sol

二者选其一,考虑最小割建模。

对于 i\in[1, n],连边 (s, i, a_i), (i, t, b_i)

对于第 j 个作物集合 S_{j},连边 (j_A, t, c_{2, j}), (s, j_B, c_{1, j})。对 i \in S_j,连边 (i, j_A, +\infin),(i, j_B, +\infin)

答案为 (\sum a_i+b_i) + (\sum c_{1, i}+c_{2, i}) - \operatorname{mincut}

\color{blue}\text{P3978 [TJOI2015] 概率论}

Problem

n 个点的有根二叉树的叶子节点数的期望(两两不同)。

Sol

先考虑 DP。令 f_i 表示 i 个点的不同构二叉树个数,g_i 表示其叶子的个数和。则 \frac{f_i}{g_i} 即为所求,有:

f_i = \sum_{j = 0}^{i-1}f_jf_{i-j-1} g_i = 2\sum_{j=0}^{i-1}f_jg_{i-j-1}

初值:f_0=1g_0=0, g_1 = 1

感觉这个很有一个卷积的形式,我们使用生成函数求出这两个的通项。

卡特兰数(即 f)的生成函数 C(x) = \sum_{n \ge 0} C_nx^n。拆开,有:

\sum_{n \ge 0} C_nx^n = 1+\sum_{n > 0} \sum_{i=0}^{n-1}C_iC_{n-i-1}x^n = 1+x\sum_{n > 0} \sum_{i=0}^{n-1}C_ix^iC_{n-i-1}x^{n-i-1} = 1+x\sum_{i\ge0}C_ix^i\sum_{j\ge0}C_jx^j = 1+xC^2(x)

解得:C(x) = \frac{1 \pm \sqrt{1-4x}}{2x} = \frac{2}{1\mp\sqrt{1-4x}}带入 C_0=1 可以知道只有 \frac{1-\sqrt{1-4x}}{2x} 这一组解

使用牛顿二项式定理拆开 \sqrt{1-4x}

(1-4x)^{\frac12} = \sum_{n \ge 0} \binom{\frac12}n(-4x)^n

然后把组合数拆成下降幂后再展开:

=\sum_{n \ge 0} \frac{(-1)^{n-1}(2n-3)!!}{n!2^n}(-4x)^n =\sum_{n \ge 0} -2\frac{(2n-2)!}{(n-1)!n!}x^n

带入 C(x)

C(x) = \frac{1+\sum_{n \ge 0} \frac{(2n-2)!}{(n-1)!n!}x^{n}}x

常数项消了,得到。

C(x) = \sum_{n \ge 0} \frac{(2n)!}{n!(n+1)!}x^{n}

我们推导 G(x) = \sum_{n \ge 0} g_nx^n。带入转移式:g_i = 2\sum_{j=0}^{i-1}f_jg_{i-j-1}

G(x) = x+2\sum_{n\ge 2}\sum_{i=0}^{n-1}f_ig_{n-i-1}x^n = x+2x\sum_{n\ge 2}\sum_{i=0}^{n-1}f_ix^ig_{n-i-1}x^{n-i-1}

由于 g_0 = 0,可以得到:G(x) = x+2xC(x)G(x)

G(x)=\frac{x}{1-2xC(x)}。带入 C(x)=\frac{1-\sqrt{1-4x}}{2x}

G(x)=\frac{x}{\sqrt{1-4x}} =x\sum_{n\ge0}\binom{-\frac12}{n}(-4x)^n =x\sum_{n\ge0}(-1)^n\frac{(2n)!}{(n!)^2}x^n

得到 g(n) = \frac{(2n-2)!}{((n-1)!)^2}。则 \frac{g(n)}{f(n)} 为:

\frac{\frac{(2n-2)!}{((n-1)!)^2}}{\frac{(2n)!}{n!(n+1)!}} = \frac{n^22(n+1)}{2n(2n-1)}=\frac{2n(n+1)}{2(2n-1)}

至此,我们完成了这道题。

\color{green}\text{P3599 Koishi Loves Construction}

Problem

给定 n,要求构造两个 1\sim n 的排列 a, b 满足 a 的前缀和在模 n 意义下两两不同,b 的前缀积在模 n 意义下两两不同。

n \le 10^5 1s, 125MB
Sol
$b$ 的构造: + 由于最后乘 $n$ 一定会让积变为 $0$,因此一定是把 $n$ 放在最后。当 $\prod_{i < n} i \bmod n=0$ 时无解。考虑如下构造:$1 \times \frac12\times\frac23\times\frac34\times\frac45\times\frac56\times\dots\times\frac{n-2}{n-1}\times n$。由于 $\frac1i$ 在 $\bmod n$ 意义下两两不同,所以 $1-\frac1i$ 也一定两两不同。 + 把它和第一问关联一下。由于 $n$ 只有 $2, 4, p$,因此找一个原根,对 $g^k$ 做类似构造即可。 #### $\color{red}\text{P3447 [POI 2006] KRY-Crystals}
Problem

给定 nm_{1..n}。求满足 0\le a_i\le m_i\oplus a_i=0 的序列 a 的个数。

###### Sol 有一个 $O(2^nV\operatorname{poly}(n))$ 的做法是从大到小考虑每一位,然后记录有没有顶到上界。 但是异或的性质非常好啊,你发现如果现在有一个上界是 $1$ 或没有上界就可以剩下的位随便选,然后用这一个 $1$ 来补。于是从高到低枚举 $i$,表示第 $i+1\sim 32$ 位这些位都是满的。然后枚举这一位第一个没有填满的地方,让它作为调整位,记为 $j$。则 $1\sim j-1$ 的位置都是满的,它们在剩下的位数中的贡献即为它们的低位组成的数。对于一个 $j$,需要统计 $j+1\sim n$ 的位置异或和与前面相同的方案数(未填满的贡献是 $2^k$),这个显然需要进行一个 DP。令 $f_{k, 0/1}$ 表示 $k\sim n$ 这些数的第 $i$ 位异或和为 $0/1$ 的方案数。时间复杂度 $O(n\log V)$。