ARC219

AtCoder Regular Contest-- 219

闲话

最幽默的一场,拿下 \(\text{Perf. } \color{orange}{2400}\)。

其实就算最后一刻能拿下 F 也至少有个 \(2700\) 左右,至少是能看的分数,如果一开始严格分析 DP 第二维的上界还能再少几发罚时,那就是正常水平了。

已经是不知道第几次因为这种非技术性失误浪费大量优势了,这种唐明显不是简单的习惯差导致的,而是我解决很多问题的切入角度本身就是不适合现有出题体系、评测体系的,正赛只比 \(\mathcal{O}(1)\) 场,不可能给你弄个 Elo 分搁那里挂着让他慢慢变稳定 converge 到你的 avr perf,所以它为了确保比赛高区分度必定要出部分分,这就导致理想的想出题目的过程必定是一个递进的思维路径,而不是通过若干观察跳来跳去最后拼出来一个正解,所以出题人的思路自然不会和我的思路一样,就算最后能走到正解上,中间的部分分也得一个一个分别去推,正赛里面根本不现实,自然也就导致了高风险。

一个很好的例子就是一旦刻画不出结构就开始打表,开始尝试用找规律的能力强行 cover 正常线性思考的能力,不是说这样一定不行,但这对你的实力有相当高的要求,因为很多正着推显然的东西会因为这个角度变化而变得不显然。这显然不是最有效率的方法,只要不是只会这么思考,而是另一方面也有一定的训练一定的水平就可以根号分治一样地两边观察两边权衡,就好很多了。这是一个非常重要的思路,它可以把两种切入角度工具化,进而提取出可用的结构特征,从而再以这两个为基础构造出更多可用的体系。那么在解决相当复杂的,每一步可能都要正推和找规律分别考虑的题目的时候就好很多了。不是说能快到起飞但至少有一个框架,能把“做不做得出来”转化成“花多久做出来”,这是很重要的。其实这场的唐和前几场切不出 D~F 难度题目本质上都是这个原因。

我选择加训 JOI 和 ROI。主要就是要训独立推一些长链思考题的能力,这些题你说他真 Ad-hoc 也不是,其实将一堆 typical 的 observation 用最省力的方式串在一起的 Ad-hoc 和纯粹基于观察推出来的 Ad-hoc 也不是一种东西,一种更倾向于有规律有序枚举,增量构造;另一种更多是变换切入角度或者转化问题结构为等效的可做的东西,而不是转化已有条件。前者是我更缺乏的。

加训...哈哈哈加训...佳汛...喵呜...


A (Trie树、贪心、*800):

考虑建 Trie,统计对于每一位,填 \(0/1\) 分别能有几个 \(S_i\) 满足条件,两个数哪个贡献多填哪个就行了,填完之后把此时已经满足条件的所有 \(S_i\) 去掉,下一位不统计。

时间复杂度 \(\mathcal{O}(nm)\)。

ac link


B (分类讨论、*900):

这啥阴。

扫一遍整个排列,分类讨论:

  • \(P_i = i\),此时增加 \(n - i\) 种情况,即 \(P_i\) 原本位于 \(i + 1, i + 2, \dots, n\) 的情形。
  • \(P_i \ne i\),如果这里要往后操作那么必定会产生翻转解决不了的逆序对,所以实际答案只能出现在 \([1,i-1]\),可以直接退出然后统计答案。

特别的,如果对整个排列任意一个位置均有 \(P_i = i\) 那么有 \(P = Q\) 这种情况,要额外算进去。

时间复杂度 \(\mathcal{O}(n)\)。

ac link


C (DP、贪心、*1200):

注意到冲刺操作是连续的,和距离无关,所以可以将每行的关键点离散化下来,分两类策略:

  • 只在最左侧一列关键点上面移动。
  • 可能涉及到最右侧的 \(m\) 列。

第一种是好刻画的,找到每一行右端点 \(r_i\),那么答案就是 \(\sum(2r_i - 1)\) 状物。

第二种是用冲刺操作在两侧横跳,先不考虑走到 \(m\) 列的代价,每一行的代价为 \(\min\{2(p_i-1)+2(m-p_{i+1})\}\),就是走到第 \(1\) 列然后走回去,再走到第 \(m\) 列再走回去,\(p\) 就是关键点,钦定 \(p_0=1,p_{k+1}=m\)。

那么现在基础代价就是 \(2(m-1)+\sum \min\{2(p_i-1)+2(m-p_{i+1})\}\),前面那个是因为还要再走到第 \(m\) 列再走回来。但事实上这个动作可以和任意两行放在一起并行,找到 \(\min\{2(p_i-1)+2(m-p_{i+1})\}\) 极大的两行,就可以消掉这行对应的代价。

那么可以直接用堆维护上述过程,时间复杂度 \(\mathcal{O}(n \log n)\)。

ac link


D (博弈论、SG函数、*1900):

对于 \((i + j) \equiv 0 \pmod 2\) 的位置 \((i,j)\),每次挪动到 \((i + j) \equiv 1 \pmod 2\) 的位置后另一人都可以再将其挪动到另一个偶数位置上面,所以实际上是没有影响的。对于奇数位置,只需要将上面的数挪到偶数位置上面,就可以将问题转化成,从若干堆石子中,每次选出一堆取出 \([1,k]\) 个石子,问谁最终能将石子取完。

这个是 Nim 游戏,将所有奇数位置的石子数对 \(k + 1\) 取模之后异或起来,如果是 \(0\) 那么 B 胜,否则 A 胜。

时间复杂度 \(\mathcal{O}(n^2)\)。

ac link


E (构造、平面图、哈密顿回路、*1900):

二维情况不好直接做,先考虑一维的情形。也即给定一个环,每个点有 \(0/1\) 点权,你需要找到一个长度为 \(2 HW\) 的区间,使得这个区间中恰有 \(HW\) 个 \(1\)。

这样的区间必定是存在的,考虑相邻段的 \(1\) 数量之差至多为 \(1\),所以如果没有出现有 \(HW\) 个 \(1\) 的区间,必定是所有区间要么 \(1\) 个数均大于 \(HW\),要么均小于 \(HW\)。那么你考虑环上对称的两个区间,其中 \(1\) 的个数要么均大于 \(HW\) 要么均小于 \(HW\),总数必定不为 \(2HW\),矛盾了。

所以必定可以找到,那么直接枚举右端点即可。再考虑如何还原回二维平面图的情形,其实只需要任意找一条图上的哈密顿回路做这个事情即可,我的思路是可以构造一条 Zig-Zag 状回路,只需要用形如 \((1, 1) \to (1, 2W)\) 或 \((1, 1) \to (2H, 1)\) 的路径调整奇偶性即可。

时间复杂度 \(\mathcal{O}(HW)\)。

ac link


F (贪心、DP、Ad-hoc、*2600):

将每个数写成二进制,问题转化为,给定 \(n\) 个长度不超过 \(\log_2(V)\) 的 \(0/1\) 串 \(s_1,s_2,\dots,s_n\),每次可以选一段区间,取他们的最长公共后缀然后删掉,问将这 \(n\) 个串删空的最小代价。

结论是答案为 \(\sum_{i=1}^{n} |s_i| - \sum_{i=1}^{n-1}\text{LCS}(s_i,s_{i+1})\),其中 \(\text{LCS}(S,T)\) 表示串 \(S\) 和 \(T\) 的最长公共子序列。

证明:

考虑构造最长公共子序列,设 \(s_i\) 与 \(s_{i+1}\) 的最长公共子序列的第 \(j\) 项在 \(s_i\) 中位置为 \(p_{i,j}\),在 \(s_{i+1}\) 中位置为 \(p_{i+1,j}\)。那么每次删去一个字符,显然要先删去 \((i,j+1)\),再递归地将 \((i+1,q_{i+1,j})\) 和 \((i-1,p_{i-1,j})\) 删去。

因此我们考虑图论建模,对状态 \((i,j)\) 连边 \((i,j) \to (i,j+1)\),以及 \((i,j) \leftrightarrow (i,p_{i,j})\)。这会将图上所有可达点都标记,对于 \(k \lt j\) 必定不会存在连边 \((i,k)\),否则存在两条交叉的边 \(u_1 \lt u_2, v_1 \gt v_2, (i,u_1) \to (i+1,v_1), (i,u_2) \to (i+1,v_2)\),而这是显然违背 \(\text{LCS}\) 定义的。

上面所有问题建立在每个串操作时不含前导 \(0\) 的基础上,考虑加上前导 \(0\) 变成什么样的,即最小化 \(\sum_{i=1}^{n} (|s_i|+c_i)-\sum_{i=1}^{n-1}\text{LCS}(s_i\texttt{0}^{c_i},s_{i+1}\texttt{0}^{c_{i+1}})\)。这个因为 \(c_i \leq n \times \max\limits_{1 \leq i \leq n} \log_2(a_i)\) 所以可以直接 DP:设 \(f(i,j)\) 表示考虑前 \(i\) 个串,\(c_i = j\) 的最小代价,则有转移 \(f(i,j) \leftarrow f(i-1,k)+j - \text{LCS}(s_i\texttt{0}^{j},s_{i+1}\texttt{0}^{k})\)。

记 \(V = \max\limits_{1 \leq i \leq n} a_i\),那么直接按上面转移即可做到 \(\mathcal{O}(n^3\log^2V)\),然后可以进一步分析 \(c_i\) 相关性质,例如对相邻的两个 \(c_i,c_{i+1}\),必定有 \(|c_i - c_{i+1}| \leq 2 \times \log_2(V)\),所以可以进一步优化至 \(\mathcal{O}(n^2\log^2V)\)。都是可以通过的。

ac link


G (贪心、DP、欧拉路径、*3300):

将含有门的行离散化下来,记为 \(A_1,A_2,\dots,A_{|A|}\),并将第 \(A_i\) 行中存在门的列也离散化下来,记为 \(B_{i,1},B_{i,2},\dots,B_{i,|B_i|}\)。

考虑对给定的平面图四联通意义下建边,那么题目可以转化为,求一条经过所有 \(n\) 个带有门的位置以及位置 \((1,1)\) 的欧拉路径的最小总距离。

考虑 DP,设 \(f(i,x,y,c)\) 表示考虑前 \(i\) 行:

  • \(x \in \{0,1,2\}\) 表示位置 \((A_i,1)\) 的度数是 \(0\),奇数还是偶数。
  • \(y \in \{0,1,2\}\) 表示位置 \((A_i,w)\) 的度数是 \(0\),奇数还是偶数。
  • \(c \in \{0,1\}\) 表示位置 \((A_i,1)\) 与 \((A_i,w)\) 是否满足度数均大于 \(0\) 且相互不连通。

那么从 \(f(i - 1, *)\) 到 \(f(i, *)\) 就可以直接通过枚举后三维转移:

  • 位置 \((A_{i-1},1)\) 与 \((A_i,1)\) 之间的边数为 \(0,1,2\)。
  • 位置 \((A_{i-1},w)\) 与 \((A_i,w)\) 之间的边数为 \(0,1,2\)。

再来考虑最后一维,即 \(A_i\) 这一行内的连边情况,这个直接确保符合欧拉回路限制即可:

  • 从 \((A_i,1)\) 到 \((A_i,w)\),相邻位置之间各连 \(1\) 条边。
  • 从 \((A_i,1)\) 到 \((A_i,B_{i,|B_i|})\),相邻位置之间各连 \(2\) 条边。
  • 从 \((A_i,B_{i,1})\) 到 \((A_i,w)\),相邻位置之间各连 \(2\) 条边。
  • 对任意 \(1 \leq j \leq |B_{i}|\),连 \((A_i,1), (A_i,B_{i,j})\) 以及 \((A_i,B_{i,j+1}), (A_i,w)\),相邻各连 \(2\) 条边。

最终答案即为 \(\min\limits_{(x,y) \neq (0,0)} f(|A|,x,y,1)\)。

时间复杂度 \(\mathcal{O}(n \log n)\)。

ac link


posted @ 2026-09-28 00:43  Twistedmind  阅读(2)  评论(0)    收藏  举报