9 月做题记录

· · 个人记录

R14

T1

略。

T2

通过一些观察,我们发现操作序列一定形如 C P C P P P C P P ...

我们将每一段长度记为 a_i,有 k 段,则字符串长度为 \prod_i{a_i},花费为 \sum_i{a_i}

我们需要在满足 \prod_i{a_i} \ge N 的前提下,最小化 \sum_i{a_i}

根据均值不等式,a_i 一定越平均越好,我们也可以用调整法证明:a = \{t,t,\dots,t+1,t+1,\dots\}

注意到 k \le \log N,直接枚举。tt+1 的分界点也可以直接枚举。然后二分出 t 的值。

O(\log^3 N \log\log N)

T3

首先染色容易想到倒着做,这样变化会少不少。

然后区间 DP,不过显然我们只需关心区间长度,于是 f_{i,j,0/1} 表示使用到倒数第 i 个颜色,区间长度为 j,终点位于左/右端点的方案数。

可以更新到 f_{k,x,0/1},其中颜色 [k+1,i-1]j 内部跳,k 跳出去。转移可以考虑用 g_{k,x} 表示否能转移到,套一层 DP 计算即可。

T4

我们设 f_i 为经过节点 i 的路径个数。显然 ANS \ge \max{f_i}

我们经过手玩和大胆猜想,试图证明可以取等。

考虑归纳构造的套路。如果我们能选出一个集合,使得 \max{f_i}1,那么我们就完成了证明与构造。

显然选择方法就是选择若干无交路径,覆盖所有 f = \max{f_i} 的点。再具体一点,我们每次选择 f 最大的最浅点 u,并选择以其为 LCA 的路径。这样的路径总是存在的,否则 u 的父亲会是更浅的符合要求的点。该过程可以用树剖 + 线段树加速。

R15

T1

数数问题,考虑清楚方案的生成方式就不难。

T2

神秘构造题。

考虑最大效用的发挥每条线的作用。当一条线满足 (\Delta x, \Delta y) = 1 时,该线在每列都能覆盖 2 格。

于是第一步连 (0,0)(n, n-1),往下每次两端点移动两个就能高效覆盖下半部分。

上半部分是对称的,我们可能会先考虑连 (0,0)(n-1,n)。但由于最后边缘部分会有漏的,要用额外两条线补充,所以这样构造可能 \lceil (n-1)/2 \rceil + \lceil (n-1)/2 \rceil + 2 > n + 1

所以我们先连 (0,1)(n-2,n),这样就没问题了,\lceil (n-1)/2 \rceil + \lceil (n-2)/2 \rceil + 2 \le n + 1

T3

神秘计算几何 + 数数。

首先凸多边形的面积计算可以拆成三角形,我们需要锚定一个点,注意这个点是任意的,并不一定要是给定点中的,明白这一点才会有后面灵活的贡献拆解。

要注意边的方向问题,我们规定边一律指向顺时针方向,然后可以用原点到边两端点的叉积判断正负。

于是我们发现一条边对应一个三角形,依次考虑每条边的贡献,O(n^4) 地枚举所有边,考虑它在多少个 p 中出现,可以 O(n) 解决。

T4

神秘贪心 + 推式子 + DS。

0 变成 -1 以变成前缀和问题。

先考虑解决单次查询的静态问题。我们有一个贪心解法:

  1. 从左到右依次选数,如果某次选数会使得前缀和 < 0,删除该数。
  2. 在已经得到的序列上倒着如是做一遍。

其正确性是显然的,最优性的证明也不难。

a_i 表示前缀和,b_i 表示后缀和。因为这个问题有多次查询和修改,我们需要看看有没有从这两个数组出发简便得到答案的方法。

OBS 1:第一次删除的个数为 \max_i -a_i

每次删除都相当于 a 的后缀 +1,通过一定手模不难看出。

令第一次删除后的后缀和为 b'_i,则第二次删除个数为 \max_i -b'_i

OBS 2b'_i = b_i + \max_{j=1}^{n}\{-a_j\} - \max_{j=1}^{i-1}\{-a_j\}

注意删除的都是 -1,所以是显然的。

一共删除 \max_{i=1}^n\{-a_i\} + \max_{i=1}^n\{-b'_i\} = -\min_{1 \le i < j \le n}\{a_i + b_j\}

这里需要一些 \max 运算技巧,与 \sum 类似。

我们容易看出这其实是一个最大子段和

证明:P10334 [UESTCPC 2024] 饮料

神秘贪心题,至今不会证。

P10875 [COTS 2022] 游戏 M

连通性相关。

P10680 [COTS 2024] 双双决斗 Dvoboj

根号分治,小块分治数组,大块递归。

AT_arc201_c [ARC201C] Prefix Covering

字符串优先考虑 Trie。

AT_arc201_b [ARC201B] Binary Knapsack

神秘贪心题,考虑奇偶性。

W 为奇数,不妨先选择一个价值最大的 X=0 的物品,然后把 W1

于是 X=0 的物品只能选偶数个,我们可以贪心的两两合并成 X=1 的物品,如果剩下单个就舍弃。

此时 W 和所有物品的重量都是偶数,可以全部除以 2

AT_arc203_c [ARC203C] Destruction of Walls

比较复杂的数数题。有一定的转化和巧思。

自己做的时候把路径长 = H + W 的情况漏了。

https://www.luogu.com.cn/article/zvf63hbo

难:AT_arc202_c [ARC202C] Repunits

神秘数学题。

用到 min-max 容斥和莫比乌斯反演,还有一点和式手法。

https://www.luogu.com.cn/article/w2d98cnb

AT_arc197_c [ARC197C] Removal of Multiples

观察到删除并不会使数过于稀疏,所以可以直接暴力线段树。

严谨点的说法是质数 p 一定在 A_i = p 的时候被删除,所以至少大约第 Q 个质数还留着,线段树开到 3e6

AT_abc209_e [ABC209E] Shiritori

字符串双端作点,字符串作边。注意不要用字符串作点,不然边数很多,而且不是标准的有向图游戏。

初始时无出边的点必败。在删点过程中,没有被标记为必胜,但无出边的点也必败。

然后将确定状态的点删去,为什么?

  1. 如果必败,其前驱必胜,该打的标记都打完了,留在图中没有用。
  2. 如果必胜,其前驱一定会避免走到该点,其存在与否不会影响前驱的必胜与必败。

最后未删的点是平局的,因为每个点在原图都没有必败后继(否则它就是必胜的,会被删去),且它不会走到原图的必胜后继,否则就输了。然后此时没有无出边的点,所以会永远周旋。

难:AT_arc165_f [ARC165F] Make Adjacent

先考虑局部,对于两个数字,有 aabb、abab、abba 三种情况。其中前两种都是变成 aabb 最优,后一种随意,操作次数的下限分别是 0, 1, 2

我们可以证明,存在方案使得对于每一对数字都能取到下限。

解释:我们每次操作只会影响到两个数字间的相对关系,所以这里的下限是影响了两个数字间相对关系的操作次数。显然总下线就是任意两个数字的下限和。(要理解清楚需要灵活的视角,主体是一个机械的过程,这个过程中会不连续地对不同数对间的操作代价产生贡献)

R_a < R_bL_a < L_b,则连边 a \rightarrow b,求字典序最小的拓扑序。

这样边数是 O(n^2) 的,由于是二维偏序,所以可以用 CDQ 优化建图或者主席树优化建图(不会)。

难: AT_arc199_c [ARC199C] Circular Tree Embedding

**OBS**:随意钦定一个根节点,$(T,P)$ 合法当且仅当 $T$ 的任意子树在 $P$ 上是连续的(环的意义下)。 证明不难,必要性可以看出,充分性可以归纳考虑。 对元素做映射,使得 $P^1 = 0, 1, \dots, n$。这样区间就和值域吻合了,后面更加方便。 令 $f_{l,r}$ 表示 $P^1$ 的 $[l,r]$ 区间的树的个数。 转移考虑以 $mid$ 为根,左右是区间构成的森林,用 $g_{l,r}$ 表示。 $$ f_{l,r} = \sum_{mid}{g_{l,mid-1} g_{mid+1,r}} $$ 考虑到还有其他排列的限制,我们预处理值域 $[l,r]$,是否在所有区间上都是连续的。它只用于判断 $f_{l,r}$ 是否是 $0$,因为这无法通过方程直接算出。 其他排列的限制看起来存在感有点低,但确实如此。 ### 好:CF1628D2 Game on Sum (Hard Version) 博弈论 DP + DP 优化。 首先博弈论 DP **一定**画出决策树,这样十分清晰。 设 $f_{i,j}$ 表示 $i$ 次减法,$j$ 次加法的最终得分。 $$ f_{i,j} = \max_k{\min(f_{i-1,j}-k, f_{i,j-1}+k)} $$ 画出 $\min(f_{i-1,j}-k, f_{i,j-1}+k)$ 关于 $k$ 的图象,发现十分优美。 得到 $$ f_{i,j} = (f_{i-1,j} + f_{i,j-1}) / 2 $$ 通过一定展开,发现可以把贡献拆开计算,答案跟路径计数有关。 **小结**:很久没见过跟函数图像有关的 DP 优化了,还是要多尝试。 ### 难:CF843D Dynamic Shortest Path **我们为什么构建 Johnson 图?** 因为在这个图上的最短路都是 $0$。 每次给 $c$ 条边加权,最短路至多增加 $c$。这样我们就可以不用 `priority_queue` 而是用桶来实现 Dijkstra,使得总复杂度降一个 $\log$。 **我陷入了什么误区?** 我以为 Johnson 图中选取的势能是增加完 $c$ 条边的边权后的 $dis$。但这样显然是无法直接得到的(不然我不就直接找到最短路了吗?)。 事实上我们选取的 $dis$ 是加权前的。 **这个误区的根本是什么?** Johnson 图只要求一个**图**和一个**势能**即可。对于图和势能的关系没有任何要求,而我误以为势能一定要选择图的最短路。 放到这里,我们用的是加权后的图和加权前的 $dis$ 构成 Johnson 图。**加权的过程不改变势能**。 **怎么避免?** 1. 理解清楚势能与图的关系。 2. 一步一步了解我们需要做什么。 ### 难:CF1163F Indecisive Taxi Fee **代码较难** 我们有四种情况: 1. 改小,边在最短路。直接减。 2. 改小,边不在最短路。全最短路和过边最短路取 $\min$。 3. 改大,边不在最短路。不用管。 4. 改大,边在最短路。最复杂,展开讨论。 首先我们能想到如果不是最短路必经边,并不会影响答案。但仍避免不了必经边的 case。所以我们不用管必经与否。 朴素的想法是处理出删去每一条最短路上的边后的最短路。最短路有多条,但**钦定一条**比较方便解决问题,记为 $P$。 我们得到一个线性结构(最短路),考虑维护一个线性 DS 解决这个问题,线段树即可做到。 具体地,我们对于每个点 $u$,记录 $L_u$ 为 $1$ 到 $u$ 的最短路与 $P$ 的公共前缀的最右端的边的编号。这里的两条最短路在**同一个**最短路树上,也就是没有构成环。$R_u$ 与之对称。 为了方便,我们用 $L_e, R_e, e = (u,v)$ 分别表示 $L_u, R_v$。 我们枚举每条边 $(u,v)$,对 $P$ 中 $L_u$ 到 $R_v$ 之间的边进行 checkmin。整理成数据结构题,可以用吉司机树在线做,或者普通线段树离线做(从大到小枚举避免 checkmin),或者 `multiset` 离线做(扫描线)。 **这样为什么是对的?** 我们只需证明:对于任何一个 $P$ 上的边 $e$ 和 $e$ 的删边最短路在 $P$ 之外的部分 $Q$,存在 $e' \in Q$ 更新了 $e$。 假设所有的 $e' \in Q$ 都没有更新 $e$,则在 $Q$ 上一定存在一对相邻的边 $f, g$,$R_f$ 与 $L_g$ 在 $P$ 上构成的区间包含了 $e$。 我们记 $f,g$ 用于更新的最短路分别为 $d_f, d_g$,我们可以调整一下两条最短路使得 $d_f + d_g > d'_f + d'_g$,则至少有 $d_f > d'_f$ 或 $d_g > d'_g$。矛盾。 **关于求 $L,R$**: 求最短路树即可。注意倒着的时候要固定 $P$ 那一部分。 ### P3530 [POI 2012] FES-Festival **考虑极端情况是分析问题的一般方法**。我们考虑 DAG 和 SCC 的情况。 **对于 DAG**:显然解在数轴上可以无限拉长,只要按字典序排列。所以答案就是点数。 **对于 SCC**:显然变量两两之间的差值都有了上下界。 **OBS**:这个图是很紧凑的,边权都是 $0,1,-1$,所以对于任何一个解,变量的数轴上的分布都是连续的。 现在我们的任务变成了,最大化两个变量之间的差值。 任意两个变量之间的差值的**最大值**是它们之间的**最短路**,这是一个经典结论。 于是我们的答案就是任意两点最短路的最大值,还要 $+1$,因为要算上起点的 $0$。 **一般图**:答案就是所有 SCC 的答案加起来,因为 SCC 由 DAG 连接,区间之间可以被扯得无限长。 ### AT_abc345_f [ABC345F] Many Lamps 首先奇数无解。 **My solution**:首先观察到我们只需要找一棵生成树即可,因为非树边是可以通过树上路径平替的,另外还发现我们可以改变树上任意两点的状态。然后按照 DFS 序构造,一次点亮一个儿子和父亲。可能会在叶子上遇到孤立点,我们记下来等 DFS 到一个不亮的点再一起点亮。 **Other solution**:我们每次操作都是让亮的灯数 $+2,0,-2$。用**中值定理**的思想,$0$ 到 $maxk$ 的所有值我们都是可以构造出来的。还是找生成树,具体的构造方法 DFS 从子树开始构造,每次都操作当前点和一个儿子,保证儿子都点亮。 这种中值定理的思想比较重要。 ### 典:CF888G Xor-MST 首先建 Trie。 **Kruskal 做法**:观察到对于 Trie 上的两棵子树间连边显然不如子树内连边优,但要求连通,所以只要有一条。于是可以递归连边,连跨子树边的时候用启发式合并或者直接合并都行(因为树高有限),合并的时候贪心走 Trie。 **Boruvka 做法**:求一个块的最小边的时候先把块内的点从 Trie 上删掉,然后对每个点贪心走 Trie,最后加回来即可。 ### 难:CF2041N Railway Construction [最小生成树经典结论](https://www.luogu.com.cn/article/gq5jnvm8) 囊的过分的一道题( 考虑根号分治。 **Tips**: 1. 认为 $n$ 与 $m$ 同阶。 2. 由于禁用边和完全图的性质,本题复杂度分析有大量均摊。 **先算静态问题**: 将点按 $a$ 排序,先进行一轮魔改 Boruvka。前 $B$ 个点不连安全边,后面的点只连前 $B$ 个点。 具体地,类似 $mex$,只有前面若干个禁用边连续的时候才会起效,于是我们判断当前点的第 $i$ 条禁用边是否连向 $i$ 即可。 这样会形成若干**菊花图**和若干**单点**。菊花图中,前 $B$ 个点作花心。单点数为 $m / B$。$m + m/B > 2\sqrt m$,$B = \sqrt m$ 取最小。 故总块数 $O(\sqrt m)$。 处理出两两块之间的最小边,跑不带堆优化的 Prim 就完成了。 具体地,我们记块 $p, q$ 之间的边数为 $m_{p,q}$,由完全图的性质,我们要尽量选择 $p$ 中小的点去连 $q$ 中**最小能连**的点,而这些禁用边至多 ban 掉 $p$ 中前 $m_{p,q}$ 个点,我们扫描前 $m_{p,q}+1$ 个点即可。总复杂度是 $O(m)$ 的。 关于怎么求最小能连的边,既然有了根号,不妨大胆些。用一个 `vector` 存下任意两个块之间的边。然后枚举每一对块,利用边现场建新图,然后用上面的方法即可。 复杂度 $O(n)$。 **动态问题**: 如果删去的是 MST 上的叶子,显然是容易的。 而非叶子个数为 $O(\sqrt n)$,原本的花心,加上 Prim 每步至多产生 $2$ 个非叶子。 所以如果删非叶子,直接重跑 MST。 总复杂度 $O(n\sqrt n)$。 **无解情况(图不连通)**: 1. $n=2$ 直接输出两个 $0$。 2. 只有一个孤立点,则除删该点外,其他都是 $-1$。 3. 否则所有都是 $-1$。 **小结**: 根号方法其实是万用的,它能让很多暴力具有优秀的复杂度,又不过分依赖题目的性质,不妨多多尝试。 **代码细节**: 非常非常多。这里仅列出现 TLE 后的问题。 1. `t` 不能太小,否则 `m` 过小的时候就会有问题,可以取 `max(n,m)`。 2. 清除 `f` 的过程忘了以 `cnt` 为上限,导致复杂度假了。这启示我们对于从代码不能明显看出复杂度的题,要用一个计数器来检测一下计算量。 3. `define int long long` 的常数有点大,卡常时要关掉。 [code](https://codeforces.com/contest/2041/submission/339445616) ### AT_abc424_f Adding Chords 赛场上想到了 Hash 做法,可惜太颓了不想写。 首先断环成链,这一步无需任何代价。考虑给边的两端打赏正负标记,查询时只需求区间和就能判断是否有交。 刚开始想用 $1$ 和 $-1$,但显然不同边会相互影响,为了去除影响,我们给每个点赋随机权值(或者 $2^i \bmod P$),就解决了。 这很像某和哈希。 (哈希就是给结构赋值) ### AT_arc206_d LIS ∩ LDS 神秘构造题。[题解](https://atcoder.jp/contests/arc206/editorial/13955) 比较合理的做法是爆搜出小规模的情况,人肉构造还是太吃注意力了。 ### 典:P12444 [COTS 2025] 发好奖 / Hijerarhija DFS 序的树形 DP。 挺有收益的一道题。虽然之前做过类似的题,但并不熟悉。 **小结**: 1. 这类题通常有两个转移方向:子树内、子树外。 2. 转移只需要**最简转移**,当前点不选的方案也可以更新到子树内,但我们不用管。就好像 LIS 也可以一次拼接两个数,但没必要。 3. 转移方向跟当前点的选择有关。我们当然可以搞个 $0/1/2$ 位来辅助。但更巧妙的是把状态描述改为左闭右开区间:$f_{i,j}$ 表示考虑 DFS 序中 $[1, i)$ 人,使用 $j$ 奖金的最大积极性。 树上背包的经典优化技巧能不能用于这道题? ### P12449 [COTS 2025] 吸尘 / Usisavač 又被构思题创飞了。 我们定义高度 $h_i$ 为 $i$ 往子树中能走的最远距离,$d_i$ 为深度。 经过一定的手玩,我们发现在高度大的位置,每条边至少经过 $4$ 次。并且下界可达。 而高度小的边(其较深端点 $i$ 满足 $h_i < r$)至少 $2$ 次。并且下界可达。 又由于 DFS 的原因,又一条从 $1$ 到叶子的经过次数还能再 $-1$。我们让这个叶节点为最深的点即可取到最优解。 $$ ANS = 4(n-1) - 2\sum_i [h_i<r] - \max_i d_i $$ 其中 $2\sum_i [h_i<r]$ 是仅和 $r$ 有关的,可以用双指针轻松求解,用个数组存下来(离线)。 ### P12359 [eJOI 2024] 古迹漫步 / Old Orhei 虽然很简单,但是线段树优化游走还是有点意思的。 因为 `e` 数组 `M` 写成 `N`,调了半天。越界也是可能 WA 的,如果发现有玄学错误,记得检查边界。 ### 难:P12448 [COTS 2025] 观草 / Trava 套路数据结构题。 我还是喜欢从代数角度推理。 **做法一**: 常见技巧: $$ \sum_i{a_i} = \sum_{t \ge 1}{t\sum_i{[a_i=t]}} = \sum_{t \ge 1}{\sum_i{[a_i \ge t]}} $$ 对于本题, $$ \sum_{1 \le i \le N-k+1}{\max_{i \le j \le i+k-1}{a_j}} = \sum_t{\sum_{1 \le i \le N-k+1}{[\max_{i \le j \le i+k-1}{a_j} \ge t]}} $$ 但是这个 $\max \ge t$ 并不好处理,我们不妨转换成 $\min \ge t$。拿最大值减去 $a_i$ 即可。 这样我们的目标就是对每个 $t$,求满足 $[a_i \ge t] = 1$ 的长为 $k$ 的区间数量。 我们可以维护 $cnt^t_k$ 为长为 $k$ 的极长区间数量,$sum^t_k$ 为长度和。但我们不可能每次都扫一遍 $t$,所以我们维护的 $cnt$ 和 $sum$ 为各个 $cnt^t_k$ 和 $sum^t_k$ 的和。 $$ Query(k) = \sum_{i\ge k}{(sum_i + (-k+1)cnt_i)} $$ 而且 $t$ 的范围很大,我们可以将 $a$ 排序后,每次加入一个 $a_i$ 的时候,把历史中的 $t$ 都结算一下(就是几何的**扫描线**)。这里也可以用**左闭右开**技巧,每次只结算历史的,而不结算当前的,这样好写。 还需要一个并查集来维护。 此时我们解决的**静态问题**。 关于修改,注意我们修改的 $a$ 的定义,所以变成 $-1$,也就是在我们对 $t$ 扫描时出现得晚了一个单位。这个对 $cnt$ 和 $sum$ 的影响是在可控范围内的,写一个二分和区间修改即可。 **做法二**: 类似 NOIP2024 T4,计算每个点的贡献,最后好像可以用 CDQ 处理修改,但我不会( ### CF2151E Limited Edition Shop 我们不妨重标号使得 $b = [1,2,\dots,n]$。记 $S$ 为 Alice 选择的物品集合。 **OBS**:$S$ 合法 $\Leftrightarrow \forall i < j, a_i > a_j$ 若 $a_j \in S$,则 $a_i \in S$。 换言之,若 $a_i \notin S$,则 $a_j \notin S$。 于是 $f_{i,j} = $ 考虑 $a$ 的前 $i$ 个元素,最大 $\notin S$ 的元素为 $j$ 的最大价值和。 **转移**:考虑 $f_{i-1,j}$ 向后转移。若 $i$ 被选择,转移到 $f_{i,j}$,需要满足 $j < a_i$;若不选择,转移到 $f_{i,max(j,a_i)}$,不需要条件。 $\max$ 可以分讨展开,接下来用线段树维护 DP 数组即可。 **小结**: 我们设计状态的时候,把限制较为直接的搬进状态里是更有利于转移的。 原本的想法:$f_{i,j}$ 表示前 $i$ 个元素,只考虑 $\le j$ 的元素的最大价值和。 它无法进行优化,甚至 $O(n^2)$ 都要上数据结构优化。 ### 难:P11239 [KTSC 2024 R2] 跳跃游戏 暴力 DP:$f_i = $ 跳到 $i$ 的最大得分。$f_i = \max(f_{i-1},f_{i-K} + A_{i-K})$。 为了方便,把 $A$ 整体右移一下。$f_i = \max(f_{i-1},f_{i-K} + A_i)$。 **Trick 1**:注意到我们只关心,后 $K$ 位的值,所以可用循环数组。更新时,$f_{i \bmod K} \leftarrow \max(f_{i \bmod K} + A_i, f_{(i-1) \bmod K})$。等价于 $+ A_i$ 后与前一个数 chkmax。 这个 trick 是经典的。 **OBS 1**:$A$ 的相同值极长段的数量是 $O(Q)$ 的。 我们考虑把若干个连续的、相同的 $A$ 合在一起转移。 ``` L----- ---x----- ---y----- ---z-R ``` 该图是一个 $A$ 段在 $f$ 上的投影形态。`L` 和 `R` 是端点,`x`、`y`、`z` 都是是与 `L` 对齐的位置。 我们批量处理第一行: **OBS 2**:对每一位 $+A_i$ 再与前一位 chkmax 等价于,集体 $+A_i$ 后再集体 chkmax。 于是我们可以用线段树维护(先假设 $K$ 比较小)。由于 $f$ 是单增的,所以循环之后就是两段单增拼到一起,chkmax 可以通过二分 + 区间覆盖实现。 **贪心**:从 `x` 开始,不需要考虑 $f_{i-1}$ 的转移情况,因为总是不如 $f_{i-K}$ 优。 于是从 `x` 到 `z` 都可以批量加,最后再补加 `z` 到 `R`。 **离散化**:离散化是数据结构优化**后**考虑的,此时的 $K$ 比较大,但由于 $A$ 的段数有限,所以投影到 $f$ 上的关键点也有限。 ### 弱项:P11915 [PA 2025] 瞬间传送 / Teleport 枚举答案是最优化问题的常见技巧,其优化就是二分答案。 从大到小枚举能获得更多信息。 我们设当前枚举到的答案为 $ans$。我们需要检查是否存在 $0$ 边 $(u,v)$ 使得任意 $(i,j)$ 的距离 $\le ans$。 我们考虑用 $(i,j)$ 淘汰 $(u,v)$。 若 $d(i,j) > ans$,设 $d(i,u) \le d(i,v)$,则需要满足 $d(i,u)+d(v,j) \le ans$,否则 $(u,v)$ 就是不可行的。可以证明,我们不需要考虑 $d(i,v)+d(u,j)$ 的情况,因为这种方案不如不用 $(u,v)$。 我们可以枚举 $i$,对每一个 $v$,维护 $\max_{d(i,j)>ans}d(v,j)$(看题解的时候没理解到这里也是跟 $i$ 有关的)。 这里的实现需要一些均摊。 **小结**: 都是一些很朴素的程序设计技巧,但显然我并不熟练。 ### CF786B Legacy 线段树优化建图模板。