VI 2026.5.30 (10)

FUN

在讲题前,lhr 跟 AI 说:

接下来,我将给出若干篇题解。你无需考虑题目信息概括是否全面等,仅考虑其描述的思考过程。如果该思考过程写的跟垃圾一样,请给出shit!单词,并修改满足上述要求。否则,仔细研究思考过程。每一步是如何想到,为什么正确必须有严谨证明,否则请修改题解,满足上述要求。

被评为 shit 的题解的编号:\(\text{(I)}\text{(II)}\text{(V)}\text{(VIII)}\)

凭什么说含有 hy 大神的话的题解是垃圾!我令 \(\text{(I)}\text{(II)}\text{(V)}\) 都不垃圾!

根据该数据,计算 lhr 自己的题解的垃圾率是 \(60\% \to 0\%\),小于 AI 辅助 lhr 题解的垃圾率 \(20\%\)。

lhr 比 AI 帮忙强!而且又不是 AI 讲,是 lhr 讲啊。

\(\text{(I)}\) [CodeForces 1418 C] Mortal Kombat Tower

已知 \(n\) 个首领的序列 \(a_1, a_2, \dots, a_n\),其中 \(a_i = 0\) 表示简单,\(a_i = 1\) 表示困难。两人轮流行动,好友先手。按顺序每轮每人必须击杀 \(1\) 或 \(2\) 个首领,好友击杀困难首领需要消耗 \(1\) 个跳过点。求击杀所有首领所需的最少跳过点总数。\(t\) 组测试数据。
数据范围:\(1 \le t \le 2 \times 10^4\),\(1 \le n \le 2 \times 10^5\),\(\sum n \le 2 \times 10^5\),\(a_i \in \{0,1\}\)。

提示:考虑如何贪心让你选走 \(1\)?考虑每一轮(你和你的朋友)可能取走的数对价值的影响?

上面提示对应贪心和动态规划。

$(1). $ 贪心

考虑数组分段,分成若干 \(0\) 和 \(1\) 的段,则:

对于 \(0\) 的段,总能拼凑出来让你到达下一个 \(1\) 段的方案,这一段是什么并不影响答案。

对于 \(1\) 的段,除去左边没有 \(0\) 的 \(1\) 段,朋友每次取 \(1\) 个,你每次取 \(2\) 个最优,因此朋友最少拿到 \(\lfloor\dfrac{n}{3}\rfloor\) 个 \(1\)。特殊情况中可以朋友取 \(1\) 个然后视为正常段。

于是贪心,特殊处理第一位的叠加,其余部分统计连续 \(1\) 的长度套公式叠加即可。

$(2). $ 动态规划

考虑对于选取到了第 \(i\) 位,上一轮可能取走了 \(2, 3, 4\) 个元素中的任意一种,则分类讨论,朋友先取,判断是否需要叠加,并对答案取最小值即可。设 \(p_i\) 为第 \(i\) 位对答案产生的贡献。

  • 你和朋友一共取走了 \(2\) 个,则你取走了靠后的那个,你朋友取走了靠前的那个。
  • 你和朋友一共取走了 \(3\) 个,则你取走了靠后的两个,你朋友取走了靠前的一个。显然这样是最优的,可以计算尽量小的贡献。
  • 你和朋友一共取走了 \(4\) 个,则你取走了靠后的两个,你朋友取走了靠前的两个。

\[dp_i = \min\{dp_{i-4} + p_{i-3} + p_{i-2}, dp_{i-3} + p_{i-2}, dp_{i-2} + p_{i-1}\} \]

显然动态规划比较无脑,贪心写起来比较简单。本题也存在其他动态规划做法,请读者自行研究。

\(\text{(II)}\) [CodeForces 1472 E] Correct Placement

给出 \(n\) 个人,第 \(i\) 个人有身高 \(h_i\) 和宽度 \(w_i\)。每个人可以站立(矩形 \(h_i \times w_i\))或躺下(矩形 \(w_i \times h_i\))。称 \(j\) 可以放在 \(i\) 前面,若存在一种方向选择使得 \(j\) 的矩形在两个维度上均严格小于 \(i\) 的矩形(即 \(h_j' < h_i'\) 且 \(w_j' < w_i'\),其中 \((\cdot)'\) 表示选择后的尺寸)。对每个 \(i\),求任意一个 \(j \neq i\) 使得 \(j\) 可放在 \(i\) 前,若不存在则输出 \(-1\)。\(t\) 组测试数据。
数据范围:\(1 \le t \le 10^4\),\(1 \le n \le 2 \times 10^5\),\(\sum n \le 2 \times 10^5\),\(1 \le h_i, w_i \le 10^9\)。

提示:在变化中把握不变。(——钱班八年级数学组 hy)

来,双变量的恒成立与有解问题(?)。咱也是先当别人徒弟,再当别人师父。(参考了 hy 大神的话)

考虑控制双变量其一,先对 \(h\) 排序。嘶我们好像忘记了什么。

遇事不决就换元。(——一位数学大神)

不妨设 \(h_i = \min\{x_i, y_i\}\),\(w_i = \max\{x_i, y_i\}\)。容易猜到这样规定是更优的。

证明:对于任意两人,存在方向使 \(j\) 严格小于 \(i\) 当且仅当 \(\min\{h_j,w_j\} < \min\{h_i,w_i\}\) 且 \(\max\{h_j,w_j\} < \max\{h_i,w_i\}\)。

  • 必要性:设 \(h_j',w_j'\) 与 \(h_i',w_i'\) 为满足条件的方向,则 \(\min_j \le h_j' < h_i' \le \max_i\),且 \(\min_j \le w_j' < w_i' \le \max_i\);同时,由于 \(h_j',w_j'\) 是 \(\min_j,\max_j\) 的排列,\(h_i',w_i'\) 是 \(\min_i,\max_i\) 的排列,结合 \(h_j'<h_i'\) 与 \(w_j'<w_i'\) 可推出 \(\min_j < \min_i\) 且 \(\max_j < \max_i\)(分类讨论即可)。
  • 充分性:若 \(\min_j < \min_i\) 且 \(\max_j < \max_i\),则取 \(j\) 的方向为 \((\min_j,\max_j)\),\(i\) 的方向为 \((\min_i,\max_i)\),直接满足严格小于。

因此,可将每个人标准化为 \(h_i = \min\{x_i,y_i\},\,w_i =\max\{x_i,y_i\}\),问题等价于找 \(j\) 使 \(h_j<h_i\) 且 \(w_j<w_i\),不失一般性。

然后,控制 \(h\),额外两个指针,分别指向下一个尚未考虑纳入候选者的位置和到目前为止,所有已经扫过的人中,\(w\) 最小的那个人的原始下标。这样做的原因是输出任意一个的情况下,找尽量小的数能够满足尽量多的条件。

本题还有其他做法,请读者自行探索。

\(\text{(III)}\) [CodeForces 1329 B] Dreamoon Likes Sequences

已知整数 \(d, m\)。求满足以下条件的数组 \(a\) 的个数(对 \(m\) 取模):长度 \(n \ge 1\),\(1 \le a_1 < a_2 < \dots < a_n \le d\);定义 \(b_1 = a_1\),\(b_i = b_{i-1} \oplus a_i\)(\(\oplus\) 为按位异或),要求 \(b_1 < b_2 < \dots < b_n\)。\(t\) 组测试数据。
数据范围:\(1 \le t \le 100\),\(1 \le d, m \le 10^9\)。

提示:寻求数列中数的一部分性质。

由 \(b_i = b_{i-1} \oplus a_i\) 且 \(b_i\) 严格递增,可推出 \(a_i\) 的二进制位数必须严格递增(否则同位数异或会降低最高位)。因此序列中的数来自不同的二进制位段,且自然有序。

设 \(L = \lfloor \log_2 d \rfloor + 1\)(\(d\) 的二进制位数)。

  • 对 \(i = 0\) 到 \(L-2\)(位段 \([2^i, 2^{i+1})\)),可选数字个数为 \(2^i\),方案数为 \(2^i + 1\)(选一个或不选)。
  • 对最高位段 \(i = L-1\)(\([2^{L-1}, d]\)),可选数字个数为 \(d - 2^{L-1} + 1\),方案数为 \(d - 2^{L-1} + 2\)。
  • 所有位段独立,总方案数为 \(\left( \prod_{i=0}^{L-2} (2^i+1) \right) \times (d - 2^{L-1} + 2)\),减去空序列(\(n=0\))得答案。

本题也可用动态规划,请读者自行研究。

\(\text{(IV)}\) [CodeForces 1353 E] K-periodic Garland

已知长度为 \(n\) 的二进制字符串 \(s\)(0 表示灯灭,1 表示灯亮)和正整数 \(k\)。每次操作可将任意一位取反。要求最终字符串中任意两个相邻的 1 的距离恰好为 \(k\)(即所有 1 的位置构成公差为 \(k\) 的等差数列,且允许没有 1 或只有一个 1)。求最少操作次数。\(t\) 组测试数据。
数据范围:\(1 \le t \le 2.5 \times 10^4\),\(1 \le n \le 10^6\),\(\sum n \le 10^6\),\(1 \le k \le n\)。

提示:考虑如何划分问题?

在 \(\pmod k\) 意义下问题变成了 \(k\) 个独立的子问题,转化后提取所有下标取模相等的数,则问题变为使一段连续的区间全部变为 \(1\) 的最小修改次数。

贡献直接算不好算,考虑先变为全 \(0\),则若这一位要为 \(1\),原先是 \(1\),返还 \(1\) 点贡献,否则增加 \(1\) 点贡献。

本题也可用动态规划或贪心,请读者自行研究。

\(\text{(V)}\) [CodeForces 1307 D] Cow and Fields

已知 \(n\) 个点 \(m\) 条边的无向连通图,有 \(k\) 个特殊点 \(a_1, a_2, \dots, a_k\)。可以添加一条边连接两个不同的特殊点(允许该边已存在)。添加后,考虑从 \(1\) 到 \(n\) 的最短路径长度。求这个最短路径长度的最大值。
数据范围:\(2 \le n \le 2 \times 10^5\),\(n-1 \le m \le 2 \times 10^5\),\(2 \le k \le n\),所有 \(a_i\) 互不相同。

提示:考虑最终答案的组成部分。

设选取点对 \((i, j)\),则答案为 \(f(1 \to i) + 1 + f(j \to n)\),其中 \(f(j \to n) = f(n \to j)\),则记 \(x_i = f(1 \to i), y_i = f(n \to i)\),最大化 \(x_i + y_j + 1\) 的值。

由于在求最短路,故其长度一定不会超过 \(x_n\),如果超过 \(x_n\) 则加边无效,最短路根本不会走这条边,还要取个 \(\min\)。

这好像又变成了双变量的恒成立与有解问题。我们对编号用 \(x_i\) 排序,则有结论,对于每个 \(x_i\),仅需考虑 \(y_{i+1}\)。

设最终答案点为 \(j\),先证 \(i < j\)。反证法:若 \(i > j\),则 \(x_i > x_j\),则 \(x_i + y_j \ge x_j + y_j \ge x_n\),与我们希望答案小于 \(x_n\) 矛盾,假设不成立。根本不会影响答案,考虑它是没有意义的。

然后,若存在 \(y_{i+1} \ge y_i\),则计算相邻的,即可超过最大值(无意义);否则,单调递减,最大值只会出现在相邻位置。

本题貌似也可以二分,请读者自行探索。

\(\text{(VI)}\) [CodeForces 1312 E] Array Shrinking

已知整数序列 \(a_1, a_2, \dots, a_n\)。可执行任意次操作:选择一对相邻且相等的元素 \(a_i = a_{i+1}\),将其替换为一个值为 \(a_i + 1\) 的元素。每次操作后数组长度减 \(1\)。求最终可能得到的最小数组长度。
数据范围:\(1 \le n \le 500\),\(1 \le a_i \le 1000\)。

提示:考虑区间能否合并成一个数字。

看到这个题和数据范围应该想到区间动态规划。

设 \(dp[l][r]\) 表示子段 \(a_l \dots a_r\) 经过操作后能得到的最短长度,\(val[l][r]\) 表示该子段在能合并成单个数字时的数值。初始 \(dp[i][i] = 1\),\(val[i][i] = a_i\)。

枚举分割点 \(k \in [l, r-1]\),首先 \(dp[l][r] = \min\{dp[l][r], dp[l][k] + dp[k+1][r]\}\)。这个是正常合并。

若 \(dp[l][k] = 1\) 且 \(dp[k+1][r] = 1\) 且 \(val[l][k] = val[k+1][r]\),则可将这两部分进一步合并为一个数,此时 \(dp[l][r] = 1\),\(val[l][r] = val[l][k] + 1\)。

答案即 \(dp[1][n]\)。

\(\text{(VII)}\) [USACO 20 Feburary Platinum] Delegation

已知一棵 \(n\) 个结点的树,需要将树划分成若干条路径(每条路径为树上简单路径,且所有路径的顶点不相交且覆盖所有顶点),每条路径包含的边数至少为 \(K\)。求最大的整数 \(K\) 使得存在这样的划分。
数据范围:\(1 \le n \le 10^5\)。

提示:二分答案,贪心向上拼接未完成的路径。

二分 \(K\),问题转化为判定是否能划分。

考虑 DFS 自底向上处理:对每个结点 \(u\),收集所有子结点返回的“向上延伸的未完成路径长度”(即从 \(u\) 的某个子结点出发、还未达到 \(K\) 条边的路径长度)。将这些长度加上 \(1\)(\(u\) 到子结点的边)后存入多重集。

目标:尽量在 \(u\) 处将两个未完成的子路径拼接成一条长度 \(\ge K\) 的完整路径(并消耗掉这两条),剩余的最长一条可以继续向上传递(作为 \(u\) 返回给父结点的延伸长度)。

若 \(u\) 是根(\(1\) 号点),则不允许向上传递任何未完成路径,必须保证全部拼接完成。实现时,对多重集反复匹配:每次取最小长度 \(l\),找第一个 \(\ge K-l\) 的伙伴进行配对删除。若找不到,则标记该 \(l\) 为待向上传递的候选(只能保留一条)。若根结点仍有多余未匹配路径,则判定失败。

\(\text{(VIII)}\) [AtCoder Regular Contest 220 B] Incomplete Shuffle

已知正整数 \(N\) 和两个长度为 \(N\) 的整数序列 \(A=(A_1,A_2,\ldots,A_N)\),\(B=(B_1,B_2,\ldots,B_N)\)。对 \(A\) 依次进行 \(N-1\) 次操作:第 \(i\) 次操作(\(1\le i\le N-1\))选择一个整数 \(j\) 满足 \(i<j\le N\),并交换 \(A_i\) 与 \(A_j\)。求 \(N-1\) 次操作结束后,满足 \(A_k = B_k\) 的下标 \(k\) 的最大可能个数。\(T\) 组测试数据。
数据范围:\(1\le T\le 10^5\),\(2\le N\le 3\times 10^5\),\(\sum N\le 3\times 10^5\),\(1\le A_i,B_i\le N\)。

提示:建图后每个连通块至少损失一次匹配机会。

将每个位置 \((A_i,B_i)\) 视为连接数值 \(A_i\) 和 \(B_i\) 的无向边,建图后记 \(\text{out}_x\) 为 \(x\) 在 \(A\) 中的出现次数,\(\text{in}_x\) 为在 \(B\) 中的出现次数,\(d_x=\text{out}_x-\text{in}_x\)。

则每个连通块内 \(\sum d_x=0\),且最大匹配数(即最终 \(A_k=B_k\) 的位置数)等于 \(N-\bigl(\text{block}+\sum\max(d_x,0)\bigr)\),但当全图仅一个连通块且所有 \(d_x=0\) 时需额外加 \(1\)(可全部匹配)。用并查集维护连通块,统计即可。

\(\text{(IX)}\) [CodeForces 1326 E] Bombs

已知 \(1\) 到 \(n\) 的排列 \(p_1, p_2, \dots, p_n\),以及另一排列 \(q_1, q_2, \dots, q_n\)。考虑一个过程:初始集合 \(A = \varnothing\),对于 \(i = 1\) 到 \(n\):将 \(p_i\) 加入 \(A\);如果位置 \(i\) 有炸弹,则删除 \(A\) 中的最大元素。最终 \(A\) 非空,定义炸弹配置的代价为 \(A\) 中的最大元素。对于每个 \(i = 1 \dots n\),求炸弹位于位置 \(q_1, q_2, \dots, q_{i-1}\) 时的代价(\(i=1\) 时无炸弹)。
数据范围:\(2 \le n \le 3 \times 10^5\)。

提示:答案递减,用线段树维护“比当前答案大的数是否会被全部炸掉”。

倒序考虑答案。初始无炸弹时答案为 \(n\)。随着炸弹逐个加入,答案单调不增。

设当前答案为 \(x\),我们需要判断 \(x\) 是否可行:即所有 \(\ge x\) 的数是否至少有一个最终保留。

将 \(p\) 中每个值映射到其下标,对于值 \(v\),定义其位置 \(pos[v]\)。炸弹位于 \(q_1 \dots q_{i-1}\)。

对每个位置 \(j\),设 \(cnt_j\) 为 \([1,j]\) 中炸弹个数。一个值 \(v\) 能被保留当且仅当存在 \(k\) 使得 \(pos[v] \le k\) 且 \(v\) 在 \(k\) 时刻加入后,在 \(k\) 之后未被炸弹炸掉。等价于:在 \(pos[v]\) 及之后,炸弹数量必须小于从 \(pos[v]\) 起保留的 \(\ge v\) 的数的个数。转化为线段树维护:对每个位置 \(j\),记录“\(\ge x\) 的数的个数减去炸弹数”。当全局最大值 \(>0\) 时 \(x\) 可行。

实现时从大到小加入值并调整线段树,用 \(tr[1]\) 判断。

\(\text{(X)}\) [CodeForces 1310 D] Tourism

已知 \(n\) 个城市(编号 \(1\) 至 \(n\)),任意两个不同城市 \(i\) 和 \(j\) 之间有两条有向边:\(i\to j\) 和 \(j\to i\),边权可能不同,且 \(i\to i\) 不存在(视为 \(0\))。从城市 \(1\) 出发,恰好经过 \(k\) 条边(\(k\) 为偶数),最终回到城市 \(1\),且路径中不能出现长度为奇数的环(即不能通过奇数条边回到某个已访问的城市)。求最小总边权和的路径。
数据范围:\(2 \le n \le 80\),\(2 \le k \le 10\),\(k\) 为偶数。

提示:随机二分图染色后限制跨色移动,多次随机取最优。

禁止奇数环等价于路径必须是一个二分图上的合法行走(相邻点不同色)。由于 \(k \le 10\) 且 \(n\) 较小,但精确解法复杂,采用随机化:多次将点随机分为两色(\(0\) 或 \(1\)),强制每一步必须从当前颜色跳到相反颜色,则路径自然无奇数环。

设 \(dp[t][v]\) 表示走了 \(t\) 步到达 \(v\) 的最小代价,初始 \(dp[0][1]=0\),转移时只考虑颜色不同的 \(u\to v\)。最后取 \(dp[k][1]\)。由于 \(1\) 的颜色固定(比如 \(0\)),每次随机化后运行一次 \(O(k n^2)\) 的 DP,重复 \(T=5000\) 次取最小值。正确性依赖随机划分包含最优二分图划分的概率,多次试验可保证接近最优解。

posted @ 2026-05-30 11:12  _lhr  阅读(13)  评论(0)    收藏  举报