【JZOJ3824】【NOIP2014模擬9.9】渴

SLAF

世界乾涸,Zyh認爲這個世界的人們離不開水,於是身爲神的他要將他掌控的僅僅兩個水源地放置在某兩個不同的城市。這個世界的城市因爲荒蕪,他們僅僅保留了必要的道路,也就是說對於任意兩個城市有且僅有一條可行的道路。更簡單的,城市形成了一棵樹。
Zyh要將這兩個水源放在兩個不同的城市。飢渴的人們會選擇一個離他們最近的水源,並向其走去。每個城市的人的速度都是相同的,並且兩個相鄰(有邊直接相連)的城市的距離都是1,每個人花費的時間也都是1。zyh想知道對於他的每種放置方案,最遲到達的時間是多少。
對於100%的數據 n<=200000 , m<=200000

THISR

對於詢問x,y ,如果從xy 這條路徑上的中點把樹一分爲二;
那麼x 所在的樹只受x 影響,y 所在的樹只受y 的影響。
證明的關鍵:
由於原圖是一棵樹,所以xy 的路徑有且只有一條。


首先給所有點維護,以其爲子樹中並且以其出發的最長鏈、次長鏈、次次長鏈的長度。
現在考慮如何對於一個詢問而言,分別給兩棵樹求出從x,y 出發的最長鏈。
deep[x]>deep[y]
那麼從x 向上跳dist(x,y)2 就是路徑中點mid
然後,樹就變成了這樣。
這裏寫圖片描述

1.x

首先對於x 而言,現在x 的子樹中找一條從x 出發的最長鏈。
再從xmid 的路徑上找一條從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

這方法是真的騷。
但原題的出題人提供的解法就是維護最長鏈、次長鏈、次次長鏈+倍增的方法,
而非直徑的那種方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章