Loading

P4775 [NOI2018] 情报中心

题目描述
C 国和 D 国近年来战火纷飞。

最近,C 国成功地渗透进入了 D 国的一个城市。这个城市可以抽象成一张有 \(n\) 个节点,节点之间由 \(n − 1\) 条双向的边连接的无向图,使得任意两个点之间可以互相到达。也就是说,这张无向图实际上是一棵树。

经过侦查,C 国情报部部长 GGB 惊讶地发现,这座看起来不起眼的城市竟然是 D 国的军事中心。因此 GGB 决定在这个城市内设立情报机构。情报专家 TAC 在侦查后,安排了 \(m\) 种设立情报机构的方案。这些方案中,第 \(i\) 种方案是在节点 \(x_i\) 到节点 \(y_i\) 的最短路径的所有边上安排情报人员收集情报,这种方案需要花费 \(v_i\) 元的代价。

但是,由于人手不足,GGB 只能安排上述 \(m\) 种方案中的两种进行实施。同时 TAC 指出,为了让这两个情报机构可以更好的合作,它们收集情报的范围应至少有一条公共的边。为了评估一种方案的性能,GGB 和 TAC 对所有的边进行了勘察,给每一条边制定了一个情报价值 \(c_i\),表示收集这条边上的情报能够带来 \(c_i\) 元的收益。注意,情报是唯一的,因此当一条边的情报被两个情报机构收集时,也同样只会有 \(c_i\) 的收益。

现在,请你帮 GGB 选出两种合法的设立情报机构的方案进行实施,使得这两种方案收集情报的范围至少有一条公共的边,并且在此基础上总收益减去总代价的差最大。

注意,这个值可能是负的,但仍然是合法的。如果无法找到这样的两种方案,请输出 F


问题 1:我们固定一个根,那两条相交路径的结构可能是什么样子。

解答 1
考虑相交的两条路径的情况,那肯定是如下这两种。

注意下图中的一条边在原树上代表一条路径。

image


问题 2:假设两条路径分别是 \((s_i, t_i)\)\((s_j, t_j)\),那么这个方案的价值为两条路径并的边权之和减去两条路径的代价。路径并不好描述,能否换成更好描述的方式。

解答 2
设 $p_x = \operatorname{dis}(s_x, t_x) - v_x$,考虑将答案乘以 $2$,那一个方案的价值就是 $\operatorname{dis}(s_i, s_j) + \operatorname{dis}(t_i, t_j) + p_i + p_j$。

我们考虑枚举问题 1的图中绿色的结点,也就是 \(x = \operatorname{LCA}(t_i, t_j)\)。那么,答案就会变成 \(\operatorname{dis}(s_i, s_j) + d_{t_i} + d_{t_j} - 2d_{x} + p_{t_i} + p_{t_j}\)

\(c_x = p_x + d_x\),就有 \(\operatorname{dis}(s_i, s_j) + c_{t_i} + c_{t_j} - 2d_{x}\)\(-2d_x\) 是常数,所以我们可以扔掉。由于有一定要相交的限制,因此 \(\operatorname{LCA}(s_1, t_1)\)\(\operatorname{LCA}(s_2, t_2)\) 不能在 \(x\) 的子树内,\(t_1, t_2\) 要在 \(x\) 不同儿子的子树中。

因此,问题转化为求 \(\operatorname{dis}(s_i, s_j) + c_{t_i} + c_{t_j}\) 的最大值,其中 \((s_i, t_i)\)\((s_j, t_j)\) 要满足上述限制。


引理:上面的问题是一个和树上最远点对有关的问题。我们先不考虑原题,先来思考一下:\(\operatorname{diam}(S)\) 为树上点集 \(S\) 的最远点对。那么,有 \(\operatorname{diam}(S_1 \cup S_2) = \operatorname{diam}(S_1) \cup \operatorname{diam}(S_2)\)

有了这个引理,我们就可以合并两个点集的最远点对。这也就能支持线段树的 pushUp 操作。


问题 3:分析一下对于每个 \(x\),满足其限制的那些路径中在子树外的端点集合,是什么样的。

解答 3

考虑第 \(i\) 条路径在 \(x\) 等于多少时满足其限制,也就是一个端点在 \(x\) 子树中,\(\operatorname{LCA}\)\(x\) 的父亲到根的路径上。假设 \((s_i, t_i)\) 路径上经过的节点集合是 \(P\),显然 \(x \in P - \{\operatorname{LCA}\}\) 时路径满足限制。

image

因此,我们进行一个树上差分,从下网上扫,在图中绿色顶点处时候加入路径 \(i\),在图中蓝色顶点处处理完毕时删除路径 \(i\),即可实现一个类路径加。(注意不能是在 \(\operatorname{LCA}\) 处减去路径 \(i\),具体我们后面再说)


问题 4:我们需要对于每个点 \(x\),维护一个集合,每次 \(x\) 集合要先是所有儿子集合的并,然后需要动态实现单点加删路径,求出这个集合中的类最远点对。如何维护?

解答 4
由于有合并操作,因此考虑线段树合并维护。我们令线段树上的一个区间维护的是该区间中的路径的类最远点对值。

我们按顺序遍历儿子 \(v\),并依次将 \(v\) 的线段树合并到 \(u\) 上,在合并的过程中计算类最远点对。显然,这可以支持单点加和单点删除操作即可。

注意,由于在子树内的端点匹配,需要是不同子树中的,所以我们是在利用儿子 \(v\) 的线段树信息计算 \(u\) 的答案。也因此,删除路径操作不能放在 \(x = \operatorname{LCA}\) 处删除,而是要放在儿子上。

posted @ 2025-12-13 15:19  DE_aemmprty  阅读(22)  评论(0)    收藏  举报