【JZOJ3824】【NOIP2014模拟9.9】渴

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

这方法是真的骚。
但原题的出题人提供的解法就是维护最长链、次长链、次次长链+倍增的方法,
而非直径的那种方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值