加载中...

7.11——769E1

769E

首先有个结论:添加的那条边的其中一个端点一定是 \(1\)。因为如果想要由经过这条边来优化到达其他点的最短距离,那么一定是直接从这条边出发最优,而不是先走一段距离到达深度较浅的点再经过这条边。得证。

到达某个点的 \(d(v)\) 的情况只有 \(2\) 种:

  1. 在原来的树中的 \(d(v)\)
  2. 必须经过添加的那条边的 \(d(v)\)

其中情况 \(2\) 一开始走的边便是新添加的那条边。则相当于在额外走了距离 \(x\) 后换了树根,重新计算从新根出发的 \(d(v)\)

  • \(O(n^{3})\) 解法:

枚举 \(x\),再枚举添边方式;固定好这两个量后,再枚举所有点,计算对应的 \(d(v)\):假设连边 \((1, root)\):

\[d'(v) = min(dist[1][v], x + dist[root][v]) \]

其中 \(dist[root][v]\) 表示以 \(root\) 为根出发的 \(d(v)\),可 \(O(n^{2})\) 预处理。

故答案为:

\[min_{root=1}^{n}(max_{v=1}^{n}(d'(v))) \]

对于每个 \(x\in[1,n]\)\(O(n^{2})\) 求得对应解,故暴力复杂度为 \(O(n^{3})\)

\(O(n^{3})\) code

  • \(O(n^{2})\) 解法:

考虑优化暴力解法中某一维的枚举。需要从 \(d'(v)\) 的计算式入手:观察到随着 \(x\) 的增大,\(d'(v)\) 的取值在 \(min\) 函数内的两项中是分段的(即存在某个 \(val\),使得 \(x<=val\) 时取右边;\(x>val\) 时取左边),故考虑 \(x\) 的取值范围对于 \(d'(v)\) 取值的影响:

  • \(x<=dist[1][v]-dist[root][v]\) \(\Rightarrow\) \(d'(v)=x+dist[root][v]\)

  • \(x>dist[1][v]-dist[root][v]\) \(\Rightarrow\) \(d'(v)=dist[1][v]\)

因此,先固定添加的是哪条边(即 \(root\) 固定),然后将所有点 \(v\) 按照 \(dist[1][v] - dist[root][v]\) 升序排序。这样就真正实现了 \(d'(v)\) 取值的分段:\(x\) 固定取某个值时,对于排序后的点序列,总是存在一个分界点,使得左边的 \(d'(v) = dist[1][v]\),右边的 \(d'(v) = x + dist[root][v]\)

又因为只需要求得 \(max_{v=1}^{n}d'(v)\),故只需要对应分界点的
\(dist[1][v]\) 的前缀 \(max\)\(dist[root][v]\) 的后缀 \(max\) 即可。而这可以在排序得到点序列后直接 \(O(n)\) 预处理得到前缀\(max\)和后缀\(max\)数组。这样就实现了 \(O(1)\) 查询最值,省去了 \(v\) 的那一维枚举。时间复杂度 \(O(n^{2}logn)\)(还有排序的复杂度)。

\(O(n^{2})\) code

posted @ 2025-07-14 08:46  jxs123  阅读(18)  评论(0)    收藏  举报