SLAF
世界干涸,Zyh认为这个世界的人们离不开水,于是身为神的他要将他掌控的仅仅两个水源地放置在某两个不同的城市。这个世界的城市因为荒芜,他们仅仅保留了必要的道路,也就是说对于任意两个城市有且仅有一条可行的道路。更简单的,城市形成了一棵树。
Zyh要将这两个水源放在两个不同的城市。饥渴的人们会选择一个离他们最近的水源,并向其走去。每个城市的人的速度都是相同的,并且两个相邻(有边直接相连)的城市的距离都是1,每个人花费的时间也都是1。zyh想知道对于他的每种放置方案,最迟到达的时间是多少。
对于100%的数据 n<=200000 , m<=200000
THISR
对于询问x,y,如果从x到y这条路径上的中点把树一分为二;
那么x所在的树只受x影响,y所在的树只受y的影响。
证明的关键:
由于原图是一棵树,所以x到y的路径有且只有一条。
首先给所有点维护,以其为子树中并且以其出发的最长链、次长链、次次长链的长度。
现在考虑如何对于一个询问而言,分别给两棵树求出从x,y出发的最长链。
设deep[x]>deep[y],
那么从x向上跳dist(x,y)2就是路径中点mid。
然后,树就变成了这样。
1.x
首先对于x而言,现在x的子树中找一条从x出发的最长链。
再从x到mid的路径上找一条从x出发的最长链:
这个可以使用倍增实现,设g1[i][j]表示,从i点出发,在与其距离为2j的父亲的路径上,不包含i的最长链。
由于不能包含x的子树,所以要维护最大值,和次大值。
2.y
对于y而言也是雷同,在LCA向下到mid时,需要维护另一个倍增数组g2[i][j]。
注意一下:
1.mid=LCA的情况;
2.LCA的父亲也可以产生最长链。
Dance in the Dark
这方法是真的骚。
但原题的出题人提供的解法就是维护最长链、次长链、次次长链+倍增的方法,
而非直径的那种方法。