2025.11 典题复习
我咋啥都不会。
\(\color{red}\text{P1117 优秀的拆分}\)
Problem
多测,每次给定 \(s\),求 \(s\) 的所有子串的所有拆分中,有多少个是 \(\text{AABB}\) 的形式。
\(T \le 10\),\(n \le 3\times 10^4\)
\(1.5s, 512MB\)
Sol
\(n^2\) 是简单的,记 \(f_i\) 表示以 \(i\) 结尾的 \(\text{AA}\) 串,\(g_i\) 表示以 \(i\) 开头的 \(\text{AA}\) 串即可。然后是一个快速统计这种复制串的经典技巧:枚举 \(l\),每隔 \(l\) 设置一个断点,这样的话一个长为 \(2l\) 的串一定穿过两个断点。只需要知道相邻断点的 \(\text{LCP \& LCS}\),然后就是区间覆盖,差分即可。复杂度是调和级数的。
\(\text{ABAB}\) 的形式比较好通过 \(\text{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 u\),\(v \leadsto n\) 在 \(1 \leadsto n\) 这条路径上第一个离开/进入的点,记为 \(l, r\),然后对 \([l, r]\) 内的点 \(\text{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)\) 表示 \(x\) 在 \(K\) 进制下每一位构成的序列。对 \(L \le x \le R\),求出 \(p(x)\) 的代价和。
\(L \le R \le 10^{15}\),\(2 \le K \le 20\)
\(1s, 125MB\)
Sol
最小代价是都移到中位数的位置。暴力的想法是枚举中位数的位置,但是这样会很麻烦,因为会有两个限制(\(L + x > R\),\(R + x > L\)),并且可能会有两个位置都有中位数。考虑一下这个东西的本质,就是类似于左右移导数均小于 \(0\),由于和在 DP 的过程中是可计算的,因此可以直接使用这个东西来进行调整:先都移到 \(1\),然后再枚举 \(1\to 2\),\(2\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_i\) 与 \(a_i \ge s\) 的 \(i\) 的数量。可以使用 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 , n\) 将 \(b_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
你想对这个东西直接上历史和,但是失败了,因为 \(\text{chkmax}\) 操作没法子拆。使用单侧递归的技巧是 \(2\log\) 的。想想这玩意求的实际上是什么:把 \(\max a\) 按时间从上到下拆开变为 \(c_{1..t, 1..n}\)。然后求和是 \(\sum_{i \le x, j \le t} c_{j, i}\),即矩形和。区间改值是一个上下左有边界的矩形 \(\text{chkmax}\),我们直接历史和失败的原因是因为上下界均有限制并且没法差分。考虑换成从左到右扫描线(即交换求和顺序),于是就可以直接维护历史和做到线对了。
\(\color{green}\text{CF1342F Make It Ascending}\)
Problem
给定长为 \(n\) 的序列 \(a\),每次可以把一个数合并到另一个数上,要求合并完后的序列单调递增,求出最小操作次数即方案。多测。
\(n = 15\) 不超过 \(1\) 个,\(n \ge 14\) 不超过 \(3\) 个,\(n \ge 13\) 不超过 \(10\) 个,\(n \ge 12\) 不超过 \(25\) 个。
\(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}) - \text{mincut}\)。
\(\color{blue}\text{P3978 [TJOI2015] 概率论}\)
Problem
求 \(n\) 个点的有根二叉树的叶子节点数的期望(两两不同)。
Sol
先考虑 DP。令 \(f_i\) 表示 \(i\) 个点的不同构二叉树个数,\(g_i\) 表示其叶子的个数和。则 \(\frac{f_i}{g_i}\) 即为所求,有:
初值:\(f_0=1\),\(g_0=0, g_1 = 1\)。
感觉这个很有一个卷积的形式,我们使用生成函数求出这两个的通项。
卡特兰数(即 \(f\))的生成函数 \(C(x) = \sum_{n \ge 0} C_nx^n\)。拆开,有:
解得:\(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}\):
然后把组合数拆成下降幂后再展开:
带入 \(C(x)\)。
常数项消了,得到。
我们推导 \(G(x) = \sum_{n \ge 0} g_nx^n\)。带入转移式:\(g_i = 2\sum_{j=0}^{i-1}f_jg_{i-j-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(n) = \frac{(2n-2)!}{((n-1)!)^2}\)。则 \(\frac{g(n)}{f(n)}\) 为:
至此,我们完成了这道题。

浙公网安备 33010602011771号