2025.9.28+7
2025.9.28
Luogu P1545
你考虑对于区间 \([s_i, e_i]\),其端点显然无法成为灌溉区间的端点,由于每个位置只能被一个机器,这里可以上差分。朴素的,设 \(f_i\) 表示覆盖 \([0, i]\) 最少需要多少个机器,转移为:\(f_i = \min_{0 \leq j \leq i}(f_j) + 1\),其中 \(i - 2b \leq j \leq i - 2a\),滑动窗口优化这个枚举就可以了。
接下来可能会口头 AC 高速过题。
Luogu P1944
简单 DP,对于每个右括号统计答案,令 \(f_i\) 表示以 \(i\) 结尾的最长合法序列长度,有转移:\(f_i = f_{i - 1} + 2 + f_{i - 2 - f_{i - 1}}\)。
Luogu P3842
记 \(f_{i, 0/1}\) 表示走完了第 \(i\) 行之后停在了左端点/右端点的最小步数,左端点必定是从上一行的右端点,右端点一定是从上一行的左端点转移来的,判断一下边界,复杂度是 \(O(n)\) 的。
Luogu P4310
考虑暴力转移,记 \(f_i\) 表示统计 \(n\) 个数,第 \(i\) 位上为 \(1\) 的最大子序列长度,对于每个数暴力枚举 \(30\) 个数位开始转移过来,然后再更新。
Luogu P4059
题解好厉害,这个化简好牛逼,其实好像是我唐了。令 \(f_{i, j, k}\) 表示匹配了前 \(i\) 个字符,B 串匹配了前 \(j\) 个字符,\(k\) 表示空格为 0/在 \(A\)/ 在 \(B\),因为显然平白无故两个穿插UN通过你是添加一个空格是无意义且不优的。分类讨论,如果 \(k = 0\),则从 \(f_{i - 1, j - 1}\) 中开始转移。如果在其中一个位置,还要考虑上一个空格的位置,转换一下规则就是每段空格的第一个代价为 \(-a\),后面的为 \(-b\),得到 \(f_{i, j, 1}\) 的转移:\(f_{i, j, 1} = \max(f_{i, j - 1, 1} - b, f_{i, j - 1, 0} - a, f_{i, j - 1, 2} - a)\)。同理可得 \(f_{i, j, 2}\),反过来写。答案在 \(f_{n, m}\) 三个选项中扫一下 \(\max\) 即可。
AtCoder ABC180 E
暴力的状压,记状态 \(f_{i, j}\) 表示当前状态为 \(i\),最后在 \(j\) 的最小代价,转移有:
其中 \(d(x, y)\) 即为题目所约束的距离。我们暴力枚举两次点,显然是有一个 \(O(2^n \times n^2)\) 的做法的,能过。
2025.9.29
明天就放假了!中午太累了,随便切了两个 ZJCPC 的题水一下。
Luogu P1896
状压板子题。记 \(f_{i, j, k}\) 表示前 \(i\) 行,第 \(i\) 行的状态为 \(j\),棋盘上放置了 \(k\) 个国王的合法方案数,有转移:
其中 \(j'\) 为满足题意不冲突的新状态,\(c(j)\) 表示状态 \(j\) 中放置的国王个数。
Luogu P1879
简单状压题,设 \(f_{i, j}\) 表示第 \(i\) 行的方案是 \(j\),对于合法的当前方案 \(j\) 和上一行方案 \(k\),除了特殊的 \(f_{1, j} = 1\) 之外,我们都有:
判断一下合法就位移一下然后看左右。
好,skip 了一堆题,现在来重新写题。
Luogu P2513
逆序对只和每个数的相对大小有关,令 \(f_{i, j}\) 表示 \(i\) 个不同数的所有排列中,逆序对数量为 \(j\) 的排列个数。边界为 \(f_{1, 0} = 1\),有转移:
前缀和优化转移。
Luogu P2511
第一问是裸的二分,对于第二问,我们令 \(f_{i, j}\) 表示前 \(j\) 个木棍分成 \(i\) 组的方案,记 \(s_i\) 为前缀和,有边界为 \(\forall i \in [1, n], f_{1, i} = [s_i \leq x]\),转移:\(f_{i, j} = \sum_{l = k}^{j - 1} f_{i - 1, l}\),\(k\) 需为最小的满足 \(s_j - s_k \leq x\) 的 \(k\),有答案 \(\sum_{i = 1}^{m + 1} f_{i, n}\)。注意到 \(s\) 是有单调性的,我们不用每次从 \(0\) 开始查 \(k\),前缀和维护这个 \(f\) 有 \(g_{i, j} = \sum_{k = 0}^{j} f_{i, k}\),改写转移:\(f_{i, j} = g_{i - 1, j} - g_{i - 1, j - 1}\),预处理出 \(s_j - s_k \leq x\) 的第一个 \(k\),滚掉 \(g, f\) 的第一维可过。
2025.9.30
Codeforces 1657E
很牛逼的题,思路到正解走的弯不是一般的多。你画一画,题意等同于对于每条 \(u(\neq 1) \to v(\neq 1)\) 的边,其边权都需要大于 \(1 \to u, 1 \to v\) 的边权的边权。令 \(f_{i, j}\) 表示给顶点 \(1\) 的 \(j\) 条边分配了权值且最大权值为 \(i\),有转移:
从 \(n - j - 1\) 条边中选取 \(k - j\) 条边,修改其权值为 \(i\),对于 \(f_{i - 1, j}\) 中的 \(j\) 个点连边向 \(1\) 连接用于转移的 \(k - j\) 条边和后者每每两点之间的权值显然要 \(\geq i\),取值 \(K\),此处的 \(K\) 为题目所给的常数 \(k\)。
Codeforces 1485F
我觉得是挺脑洞一个题,对于当前位 \(i\),要使其所填的数之和为 \(s\),可以填:\(b_i\) / \(b_i - s\),记 \(f_w\) 表示当前填的数之和为 \(w\) 的方案数,有:
- \(f_{w + b_i} = f_{w}\)
- \(f_{b_i} = \sum_{j = -R}^{R} f_j\)
但是当 \(b_i = b_i - s\) 时有重复要扣掉。这里上一个 std::map
和一个全局的偏移值 \(mov\) (应对操作一)处理。
Luogu P3423
记物品数量为 \(n\),背包体积为 \(k\),物品体积 \(b_i\),物品数量 \(c_i\) 就有 DP:\(f_{i, j} = \min(f_{i, j}, f_{i - 1, j - b_i \times k})\),这里的 \(k \leq \min(c_i, \lfloor \frac{m}{b_i} \rfloor)\),单调队列优化枚举过程。
2025.10.1
Luogu P2254
单调队列,令 \(f_{k, i, j}\) 表示在 \(k\) 时间段中,到 \((i, j)\) 的最长路径长,有一个 \(O(k \times n^2 \times m)\) 的一个转移: \(f_{k, i, j} = \max \{ f_{k - 1, i', j'} + dis \}\),一个合法的位置必定与当前位置相同行或者列,令当前时间为 \(l\) 有:
对于这个 \(\max\) 的优化上一个单调队列就做完了。
Luogu P2627
单调队列优化的板子?令 \(f_{i, 0/1}\) 表示在前 \(i\) 头奶牛中,不选 / 选了第 \(i\) 头奶牛的最大价值,令限制的区间长度为 \(l\),转移如下:
把后面这个 \(f_{i, 1}\) 改写一下,上个前缀和:
对这坨 \(j\) 的式子上单调队列即可。
2025.10.2
上午打羽球去了,回来随便打了那个 SCCPC 2021。
Luogu P6563
写出裸的区间 DP 方程,令 \(f_{l, r}\) 表示已知代价 \(l \leq x \leq r\) 之后还需要 \(f_{l, r}\) 的费用才能猜出 \(x\),有:\(f_{l, l} = 0, f_{l, l + 1} = a_l\),且转移为
考虑去拆掉这个 \(\min\) 里套着的 \(\max\),你发现这个 \(f\) 和 \(k\) 的关系可以讨论出来:
- \(\max = f_{l, k}\),当 \(k\) 减小 \(f_{l, k}\) 也减小。枚举区间的过程中,先枚举 \(r\),再倒序枚举 \(l\),则 \(k\) 是单调递减的
- \(\max = f_{k + 1, r}\),此时的 \(k\) 必定在上次求出的 \(k'\) 的左边,同样的:\(f_{l, r} = \min_{k = l + 1}^{r} f_{k + 1, r} + a_k\)
此时,对于一个 \(r\) 而言 \(k\) 是单调的,可以上单调队列了。
下午打了那个 MX-X22,质量还可以,就是不造那个构造哪里锅了。
Luogu P2569
令 \(f_{i, j}\) 表示前 \(i\) 天之后,剩下 \(j\) 只股票的最大收益,当 \(j\) 一定时,\(i\) 增大时收益 \(f_{i, j}\) 也增大,对于卖出和买入的转移有:
展开这个转移方程里的括号:
对于固定区间 \([i, j]\),\(\max\) 的取值只和 \(k\) 的取值有关,枚举 \(j\) 时 \(k\) 的取值区间是在平移的。
单调队列优化这个东西即可。
Luogu P3422
单调队列优化 DP。首先断链成环,先来考虑顺时针(逆时针同理):\(i \to i + 1 \to i + 2 \to \dots \to i + n - 1 \to i + n\) 能不能走到,此时 \(p_i \geq d_i, p_i + p_{i + 1} \geq d_i + d_{i + 1} \dots\),这个可以前缀和优化出 \(p_k - p_{i - 1} \geq d_k - d_{i - 1}, k \in [i, i + n - 1]\),即 \(p_{i - 1} - d_{i - 1} \geq \min_{i \leq k \lt i + n} p_{i - 1} - d_{i - 1}\),滑动窗口解。逆时针则有 \(d_{i - 1} - p_i \leq \min_{i - n \leq k \lt i} d_{k - 1} - p_k\)。
2025.10.3
Luogu P4588
简单地用线段树维护一个积即可。题目中重要的一个性质是 \(2\) 操作至多每个数 \(1\) 次,对于询问序列建立线段树,\(op = 1\) 就把值写成 \(x\),反之写成 \(1\),单点修改 \(1\),区间查询 \([1, i]\),做完了。
Luogu P1471
大大的一个数学题,来推一推:
2025.10.4
Luogu P4316
不会期望,恶补期望。
期望是线性的,总路径长度的期望可以直接拆出来,拆成每条边长度的期望之和,令 \(f_{u}\) 表示从 \(u\) 到终点的路径长度期望,有:\(f_{u} = \frac{\sum_{v \in u} f_v + w(u, v)}{k}\)。Topo 碾过去就可以了。
2025.10.5
Luogu P4550
记 \(f(i)\) 表示取了 \(i\) 张邮票,要取完剩下邮票的期望次数,有 \(f(n) = 0\),转移:
前面是取到已经有的邮票的期望,后面则相反,再加上抽取这次邮票的期望。
则 \(f(i) = f(i + 1) + \frac{n}{n - i}\)。
再记 \(g(i)\) 表示取了 \(i\) 张邮票,要取完剩余的邮票的期望代价。有 \(g(n) = 0\),转移:
Luogu P1654
对于新加进来的一个 \(1\),来拆一下这个贡献:
增量为后面那个 \(3x^2 +3x + 1\),来对于这个值维护期望,我们分别拆开来看 \(x, x^2\) 的期望然后合并起来,有:
得到答案 \(ans_i = ans_{i - 1} + (3 \times x2(i - 1) + 3 \times x1(i - 1) + 1) \times p_i\),对于问题输出 \(ans_n\) 即可。
Luogu P1297
依旧期望,分类讨论一下即可。
- \(a_i = a_{i + 1}\),两道题的答案都是随机的,期望为 \(\frac{1}{a_i} = \frac{1}{a_{i + 1}}\)
- \(a_i \gt a_{i + 1}\),有 \(\frac{a_{i + 1}}{a_i}\) 的概率答案落在 \([1, a_{i + 1}]\),期望为 \(\frac{a_{i + 1}}{a_i} \times \frac{1}{a_{i + 1}} = \frac{1}{a_i}\)
- \(a_i \gt a_{i + 1}\),随机答案只落在 \([1, a_i]\) 中,而第 \(i + 1\) 题正确答案落在 \([1, a_i]\) 的概率为 \(\frac{a_i}{a_{i + 1}}\) 的概率,期望为 \(\frac{a_i}{a_{i + 1}} \times \frac{1}{a_i} = \frac{1}{a_{i + 1}}\)
答案为: