[CTSC2017]网络

Posted StaroForgin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CTSC2017]网络相关的知识,希望对你有一定的参考价值。

网络

题解

首先需要我们观察出一个结论,我们先连接的边的两个端点必然都在原树的直径上。
我们将直径这条链当作原树的"根"来看看,即所有点的子树都是相对直径的子树。
如果我们连接的两个点在直径上同一个点的子树内,那么显然我们原来最长的直径长度必然不会减小,也就是说我们的最大值不变。
如果它连接的两个点在直径的不同子树中,这是原本直径两端点的距离虽然减小了,却没有减到最小。
我们考虑将条边的端点移动到子树的根,也就是直径上的节点上,直径两端点的距离会继续减小,增大的是这两子树内节点的距离,但这个距离增大后仍然不会超过直径现在的距离,否则它就是直径了。
所以必然存在一组最优解是两个点都在原树的直径上。

考虑在这个结论的基础上怎么求答案。
显然,对于最远距离距离最短这个问题,我们可以考虑二分求解,那么我们现在就相当于需要判断我们二分出的 m i d mid mid是否合法。
判断 m i d mid mid是否合法,不就是看我们当前的最大值是否小于 m i d mid mid嘛。
由于我们选择节点只会在直径上,所以每个直径上的点我们只需要记录下来它子树内最长链的长度。
我们记点 i i i内的最长链长度为 d i d_i di,它在直径上的位置为 L i L_i Li
对于直径上两个最长链距离大于 m i d mid mid的点,它们之间就只能走我们新连的边,我们记我们新连的边为 ( a , b ) ( a < b ) (a,b)(a<b) (a,b)(a<b),这里的 a , b a,b a,b大小是直径上的顺序,转化成数学表达式:
∀ i , j ( i < j ∧ L j − L i + d i + d j > m i d ) , ∣ L i − L a ∣ + ∣ L j − L b ∣ + L + d i + d j ⩽ m i d \\forall i,j(i<j\\wedge L_j-L_i+d_i+d_j>mid),|L_i-L_a|+|L_j-L_b|+L+d_i+d_j\\leqslant mid i,j(i<jLjLi+di+dj>mid),LiLa+LjLb+L+di+djmid我们不妨将后面的绝对值拆开一下,相当于满足 4 4 4个式子。
L i + L j + L − m i d + d i + d j ⩽ L a + L b L i − L j + L − m i d + d i + d j ⩽ L a − L b − L i + L j + L − m i d + d i + d j ⩽ − L a + L b − L i − L j + L − m i d + d i + d j ⩽ − L a − L b L_i+L_j+L-mid+d_i+d_j\\leqslant L_a+L_b\\\\ L_i-L_j+L-mid+d_i+d_j\\leqslant L_a-L_b\\\\ -L_i+L_j+L-mid+d_i+d_j\\leqslant -L_a+L_b\\\\ -L_i-L_j+L-mid+d_i+d_j\\leqslant -L_a-L_b\\\\ Li+Lj+Lmid+di+djLa+LbLiLj+Lmid+di+djLaLbLi+Lj+Lmid+di+djLa+LbLiLj+Lmid+di+djLaLb我们可以用线段树维护出对于 i i i满足条件的 j j j,计算它们出每个 i i i,这四个式子左半边得到的最大值。
事实上我们需要在线段树上维护的就只有 d i + L i d_i+L_i di+Li d i − L i d_i-L_i diLi的最大值。
我们得到了 L a + L b , L a − L b , − L a + L b , − L a − L b L_a+L_b,L_a-L_b,-L_a+L_b,-L_a-L_b La+Lb,LaLb,La+Lb,LaLb这四个式子的限制后,我们可以尝试枚举每个 a a a,看有没有能让满足条件的 b b b,如果有的话就说明对于我们这个 m i d mid mid有解。
这个排序后用指针就可以维护了,相当于看 4 4 4个集合有没有交集。

时间复杂度 O ( n log ⁡ 2 n ) O\\left(n\\log^2n\\right) O(nlog2n)

源码

也比较好写。

#include<bits/stdc++.h>
using namespace std;
#define MAXN 100005
#define lowbit(x) (x&-x)
#define reg register
#define luogu3761 [TJOI2017]城市

BZOJ 4901 [CTSC2017]网络

[XSY 1545] 直径

[CTSC2016]时空旅行

2016北京集训测试赛直径

Luogu P5416 [CTSC2016]时空旅行