2025.9记录
CF2134
D
当一个操作对数据结构的影响难以刻画,而题目要求我们通过该操作将数据结构调整到特定的状态(接受状态)时,可以尝试找到数据结构的某个特征,刻画操作对特征的影响考虑。应保证接受状态的该特征是同一的。
回到该题,我们选择特征为 树的直径。发现一次操作至多使直径增大 \(1\)。
证明:一次操作后,任意两点之间的距离至多增加 \(1\)。
而这样的操作对于任意非链的树都是容易构造的。同时,链(即接受状态)的直径(特征)都为 \(n\)。
CCPC Online 2025
B. 魔塔
形式化题面
树上的点被分为 \(a\) 类点或 \(b\) 类点,每个 \(b\) 类点有正整数权值 \(b_i\)。从 \(1\) 号点出发,每经过一个 \(b\) 类点,获得 \(b_i\) 乘以之前到过的不同 \(a\) 类点个数 的收益。求最大化总收益的值。
题目做法
最终收益只与经过每个点的顺序相关。这等价于要求构造一个树上点集的全序关系(记作排列 \(p\),代表到达顺序)。这个全序关系满足祖先在自己之前,即包含树上偏序关系。最大化
一个明显的贪心策略是,先排 \(u\in A\)。问题在于,如何使用该策略将一棵树的全序关系组织起来。
失败的策略
尝试该题时,我的想法是对于每个点,合并所有儿子的序列,再将自己放到头部。但本质上,考虑合并两个序列并没有将问题简化。
正解
初始是未排序的 \(n\) 个散点。每次选择两个散块拼在一起,代表两个散块的序列在最终序列中相邻。
选择方法:选择当前最优的散块,将它与其顶部节点的父亲的块相连。
正确性证明:
考虑将块 \(A\) 与 \(A\) 的父亲块 \(F(A)\) 拼起来的操作。\(F(A)\) 可能有其他子块(指可以最终序列上可以在 \(F(A)\) 后面相邻的块),记作 \(B_i\)。假设最终序列形如
\[ P=\cdots F(A)B_x\cdots A\cdots \]则
\[ P'=\cdots F(A)AB_x\cdots\cdots \]显然也是一组合法构造,且不劣于 \(P\)。
这种方法具有一定的推广性。如果能在树上偏序关系约束的情况下确定全序构造的最优形态,例如,每次可以确定一个最优的头部节点,则可以通过该方法找到满足树上偏序关系约束的最优答案。
F. 连线博弈
如果通过推导找到博弈策略困难,不妨尽快尝试打表。
参考知识:公平组合游戏、SG 函数:
公平组合游戏是一类双方交替操作;操作类型仅与局面有关,和选手无关;最后操作者获胜的博弈游戏。任意公平组合游戏 \(G\) 可以映射到一个单堆 Nim 游戏。
使用 SG 函数判断公平组合游戏是否必胜
\(G\) 为一个公平组合游戏,定义
当 \(SG(G)\neq 0\),\(G\) 游戏为必胜游戏。
当 \(G=G_1+G_2+\cdots G_k\),
M.并行计算
本题提供一块长度为 4096 的空间。初始时 \([0,1024)\) 为数组 \(a\),\([1024,2048)\) 为数组 \(b\)。其余位置为 \(0\)。目标是将 \(a\) 中对应 \(b\) 为 \(0\) 的位置变成前缀和(对应为 \(1\) 的位置随意)。
本题算子有:
本题的 \(\le 32\) 个相同类型的算子可以并行,但两并行算子 \(c\) 不能相同,\(c_i\) 不能与 \(a_j,b_j\) 相同。目标最小化并行的总次数。
直觉地想,要求最小化使用算子次数的构造题,其计算思路可能反直觉,但计算过程一定是简单的。因为复杂的计算会消耗更多的算子。
有 \(1024=32\times 32\)。启发我们基于序列分块设计算法。
最终答案为 \(a=presum(a)-premax(presum(a)\times b)\)
-
计算 \(presum(a)\)
-
顺序对 \(\forall k>0\), 进行 \(a_{k\times 32}\leftarrow\sum_{0<j\le 32} a_{k\times 32-j}\)
-
对每块求前缀和
总消耗为 \(31\times 2\) 次并行计算。
-
-
计算 \(c=presum(a)\times b\)
消耗 \(32\) 次并行计算
-
求 \(premax(c)\)
过程类似于 1.,消耗 \(31\times 2\) 次并行计算。
-
计算 \(ans=presum(a)-c\)
消耗 \(32\) 次并行计算
The 2024 ICPC Asia Hangzhou Regional Contest
D
对字符串 \(A\),一个合法的划分 \((B,C)\) 被描述为:
- \(B,C\) 为 \(A\) 的子序列,\(\forall i,A_i\) 属于 \(B\) 或 \(C\),但不能同时属于 \(B\) 和 \(C\)。
- \(B\) 的字典序小于等于 \(C\)。
要求最小化 \(C\) 的字典序。
场上有错误的想法
每次按字母字典序为第一关键字,出现位置升序为第二关键字,将 \(A\) 中字母贪心插入 \(C\)。
反例:\(1, 3, 1, 3, 1\)。正确的划分是 \((\textcolor{red}{B}\textcolor{blue}{C})\textcolor{blue}{1}\textcolor{blue}{3}\textcolor{red}{1}\textcolor{red}{3}\textcolor{blue}{1}\),但按照上述贪心会得到划分:\((\textcolor{red}{B}\textcolor{blue}{C})\textcolor{blue}{1}\textcolor{blue}{3}\textcolor{blue}{1}\textcolor{blue}{3}\textcolor{red}{1}\)。
\(n^2\) solution
考虑构造 \(C\) 的过程,当 \(LCP(B,C)\neq \min(|B|,|C|)\),我们可以停止构造。
现在考虑已构造两个串 \(S,T\),满足 \(LCP(S,T)=\min(|S|,|T|)\),\(A\) 剩余一个后缀 \(suf(A)\) 的情况。考虑对其中一个串加入字符使得其成为 \(C\)。
记 \(suf(A)\) 的第一个字符为 \(c\)。
case1. 若 \(|S|=|T|\),若将 \(c\) 加入 \(B\),则 \(C\) 对应位字符一定要大于 \(c\),不优于将整个 \(suf(A)\) 加入 \(C\)。故此时构造应为按顺序加入 \(suf(A)\) 中的字符到 \(C\),直到空或下一个字符满足 \(c'<c\)。
case2. 假设 \(|S|> |T|\)。若将 \(c\) 加入 \(T\),令其为 \(C\),不优于将 \(S+suf(A)\) 作为 \(C\)。故此时最优构造类似 case1.
故构造的过程中,我们总是可以将两串较长的那一个视作未来的 \(C\)。我们可以通过 \(DP\) 刻画该过程。故下文记 \(S=C'\),\(T=B'\)。
设 \(f_{i,j}\) 表示考虑 \(A\) 的前缀 \(A[1,i]\),\(C'\) 的长度为 \(j\),字典序最小的 \(C'\)。此时 \(B'\) 即 \(f_{i,j}\) 长度为 \(j-(i-j)\) 的前缀。
而 \(f_{i}\) 中有效的 \(j\),满足 \(\forall j_1< j_2\),\(f_{i,j_1}\) 是 \(f_{i,j_2}\) 的前缀。所以我们只需要记下最长的 \(f_{i,j}\),和它的哪些前缀是有效的即可。