2025.9记录

CF2134

D

当一个操作对数据结构的影响难以刻画,而题目要求我们通过该操作将数据结构调整到特定的状态(接受状态)时,可以尝试找到数据结构的某个特征,刻画操作对特征的影响考虑。应保证接受状态的该特征是同一的。

回到该题,我们选择特征为 树的直径。发现一次操作至多使直径增大 \(1\)

证明:一次操作后,任意两点之间的距离至多增加 \(1\)

而这样的操作对于任意非链的树都是容易构造的。同时,链(即接受状态)的直径(特征)都为 \(n\)

CCPC Online 2025

B. 魔塔

形式化题面

树上的点被分为 \(a\) 类点或 \(b\) 类点,每个 \(b\) 类点有正整数权值 \(b_i\)。从 \(1\) 号点出发,每经过一个 \(b\) 类点,获得 \(b_i\) 乘以之前到过的不同 \(a\) 类点个数 的收益。求最大化总收益的值。

题目做法

最终收益只与经过每个点的顺序相关。这等价于要求构造一个树上点集的全序关系(记作排列 \(p\),代表到达顺序)。这个全序关系满足祖先在自己之前,即包含树上偏序关系。最大化

\[\sum_{i, p_i\in B}(\sum_{j<i}[p_j\in A])b_{p_i} \]

一个明显的贪心策略是,先排 \(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)= \begin{cases} 0 & G=\emptyset\\ \text{mex}(SG(G')) & \exists G \to G' \end{cases} \]

\(SG(G)\neq 0\)\(G\) 游戏为必胜游戏。

\(G=G_1+G_2+\cdots G_k\)

\[SG(G)=\bigoplus_{i=1}^kSG(G_i) \]

M.并行计算

本题提供一块长度为 4096 的空间。初始时 \([0,1024)\) 为数组 \(a\)\([1024,2048)\) 为数组 \(b\)。其余位置为 \(0\)。目标是将 \(a\) 中对应 \(b\)\(0\) 的位置变成前缀和(对应为 \(1\) 的位置随意)。

本题算子有:

\[\begin{align*} \text{add},c &\leftarrow a+b\\ \text{sub},c &\leftarrow a-b\\ \text{mul},c &\leftarrow a\times b\\ \text{max},c &\leftarrow \text{max}(a,b)\\ \text{min},c &\leftarrow \text{min}(a,b) \end{align*} \]

本题的 \(\le 32\) 个相同类型的算子可以并行,但两并行算子 \(c\) 不能相同,\(c_i\) 不能与 \(a_j,b_j\) 相同。目标最小化并行的总次数。

直觉地想,要求最小化使用算子次数的构造题,其计算思路可能反直觉,但计算过程一定是简单的。因为复杂的计算会消耗更多的算子。

\(1024=32\times 32\)。启发我们基于序列分块设计算法。

最终答案为 \(a=presum(a)-premax(presum(a)\times b)\)

  1. 计算 \(presum(a)\)

    1. 顺序对 \(\forall k>0\), 进行 \(a_{k\times 32}\leftarrow\sum_{0<j\le 32} a_{k\times 32-j}\)

    2. 对每块求前缀和

    总消耗为 \(31\times 2\) 次并行计算。

  2. 计算 \(c=presum(a)\times b\)

    消耗 \(32\) 次并行计算

  3. \(premax(c)\)

    过程类似于 1.,消耗 \(31\times 2\) 次并行计算。

  4. 计算 \(ans=presum(a)-c\)

    消耗 \(32\) 次并行计算

The 2024 ICPC Asia Hangzhou Regional Contest

D

对字符串 \(A\),一个合法的划分 \((B,C)\) 被描述为:

  1. \(B,C\)\(A\) 的子序列,\(\forall i,A_i\) 属于 \(B\)\(C\),但不能同时属于 \(B\)\(C\)
  2. \(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}\),和它的哪些前缀是有效的即可。

I

posted @ 2025-09-11 13:31  ckain  阅读(8)  评论(0)    收藏  举报