# codeforces-editorials ### 1054F 对这种在两个状态间进行变换,且操作可逆的构造,可以考虑统一变换到一个更简单的中间状态。例如将所有 0 和 1 分离,存储在两个不同位置。 步数限制为 4s,因此每轮限制为 2s。即每个字符必须在两步以内到达集中点。构造方法很多,可以从 $2\times 2$ 的情形开始考虑。 ### 958C3 ???? ### 1184E3 E1/2/3 依次加强。E2 提示根据是否在 MST 上分成两类考虑。每条不在 MST 上的边都对应树上的一条路径,它至少要与路径中的最大边相同才能属于某棵 MST。对于在 MST 上的边,考虑所有经过它的路径所对应的树外边边集,它不能大于这个边集中的任意边。 前半个问题可以用倍增 LCA 解决。后半个问题有很多两个 log 的做法。可以用并查集做到一个 log。因为要取经过边的路径的最小值,从小到大处理路径,这样一条边被赋值就不会再变化,可以用并查集将这条边中的儿子合并到父亲。 $O((m+n)logn)$。 ### 873E 枚举 3 个分割点复杂度过高,考虑直接算出最佳的第 3 个分割点。首先根据前两组的长度计算出第 3 组的合法长度范围,然后取相邻项差值最大的位置。后者可以做到 $O(n^2)-O(1)$。(还可以 $O(n^{1.5})-O(2)$ 以及 $O(n)-O(1)$,但比较麻烦) $O(n^2)$。 ### 1107E* 最后一次删除的串是原序列的一个子序列,该子序列之外的段都是子问题。根据是否属于子序列想到两种转移,一种是将某个字符加入子序列,另一种是将一个段视为子问题。因为要加上最后删除串所得的分数,状态需要记录子序列的长度。可以枚举保留 0 还是 1,然后用 $f(i,j)$ 表示处理了前缀 $i$,子序列长为 $j$,当前累计的最大分数。这样我们就可以在所有子问题都解决的前提下,$O(n^3)$ 得到答案。整体的复杂度是 $O(n^5)$,还需要优化。注意到我们在计算子问题 $[l, r]$ 时其实也得出了 $[l, r-1]$ 所需的状态,可以将 $[l, l..n]$ 这组子问题一起计算,复杂度降为 $O(n^4)$。 tips:对于删除串的问题,可以通过考虑最后一步来观察区间所对应的子问题之间的转移。本题中这一转移比较复杂,需要通过另一个 DP 来完成。 ### 1061F* 要获得关于路径的完整信息,首先需要花费 n-2 次询问得到路径上的点。一个简单的想法是随机 60 条路径求交,将出现次数最多的视为根。没算过概率,只是感觉有点低。于是考虑精确定位路径上的根(假如有的话)。 首先要判断根是否在路径上。路径外的点可以分为三种,连接到两个端点的,以及连接到路径上其他点的。通过询问 (i,u,v) 和 (u,v,i) 可以得到连接在两个端点上的子树的大小。如果其中一棵子树的大小恰为 $(n-1)/k*(k-1)+1$(根加上根的 $k-1$ 个儿子),那么它就是根。如果大小超过了这个值,则说明根也在这颗子树中,这条路径不经过根。否则 $u$ 和 $v$ 应该没有祖先关系,可以直接从子树大小得到它们的深度。根据深度和路径的长度就能判断 LCA 的位置,从而判断是否跨根。如果跨根,那么可以通过询问 (u,i,j) 来比较路径上点到 $u$ 的距离,对它们排序,从而找出根。 ### 961G 有点纸老虎的感觉。 答案除以所有数字之和后,就是特定的一个数字 $x$ 在所有方案中所处集合大小的和。一个思路是枚举它所在集合的大小并计算出现次数,但出来的式子不会算。 注意到每个数字的每次出现至少会贡献 1,也就是总的方案数 $S(n,k)$。在样例中减去这一部分后剩下的值好像可以被 $n-1$ 整除。进一步思考后发现可以将所有方案的构造分成两种,类似于第二类斯特林数的递推公式。 1. $x$ 所在集合只有 1 个元素。$S(n-1,k-1)$。 2. 可以视为 $x$ 选择 $k$ 个已有集合之一加入。方案数贡献是 $S(n-1,k)\cdot k$。因为这些集合大小始终为 $n-1$,集合大小贡献是 $S(n-1,k)\cdot (n-1)$。 等价于 $S(n,k-1)+S(n-1,k)\cdot (n-1)$。因此算两个第二类斯特林数即可。我只会 $O(klogn)$。