ta
sk一棵n節點樹,m個詢問求(a
,b) 路徑距離。改動一條邊距為0,求m個詢問中最大距離的最小值。so
luti
on方法一:
暴力出奇蹟。
根據題意「改動一條邊」,最樸素的做法是o(
n)列舉改動哪一條邊,該邊只對路徑中存在該邊的詢問有影響。詢問可以按照是否包含該邊分為兩類,an
s=ma
x (包含的最大距離-
v ,不包含的最大距離)。
問題轉化成:判定邊k是否存在於路徑q(
a,b)
上。
如果把a,b用線相連,就會構成乙個環,假設邊k在路徑a,b上,那麼一定在這個環上。即邊k的兩個端點都在lc
a 的子樹裡,k的兩個端點是a,b中某乙個的祖先。判定子樹借助dfs序。
怎麼提高程式的效率,多騙點分呢?因為答案必定是由較大的決定的,詢問按照原路徑從大到小排序,如果已經有i的答案大於i+1的答案,就不必要在接下去查詢了,直接break。
方法二:
樹鏈剖分+線段樹
根據表示式: an
s=ma
x (包含的最大距離-v,不包含的最大距離)。
貪心包含該邊的詢問都是距離大的。
如果按照原路徑距離從大到小排序,必定存在乙個分界位置i,[1,i]包含邊v,i+1不包含邊v。那麼詢問i+1的原距離就是「不包含的最大距離」,包含的最大距離一定是詢問1.
我們可以列舉這個分界點i。如果分界點確定後,邊k必定在[1,i]路徑的交集上,且是交集中的邊權最大值。
如何找到路徑的交集呢?
當加入一條路徑時,該路徑上的每一條邊次數+1。如果邊k在路徑的交集上,那麼邊k的次數為i。
我們需要乙個資料結構幫助我們實現區間更新,區間詢問:
① 給一條路徑的權值+1
② 詢問所有邊中次數最大條件下,邊權最大值。
在序列上用線段樹,在樹上用樹鏈剖分。
方法三:
二分+差分
求「最大距離最小」邊界情況的問題,可以用二分。
因為邊長最大為1000,因此答案只可能在[m
x−1000,m
x]之間。mx表示原詢問路徑的最大值。這樣做可以提高執行效率,減少二分次數。
怎麼去寫check函式呢?
判定答案<=res是否可行:所有詢問》res的路徑都必須更改某一條邊,最終答案存在於這些邊的交集中,且要求權值最大。
求路徑的交集等價於將路徑刷漆,求次數最大的邊中權值最大的邊。
因為詢問離線,可以進行樹上的差分。
結論:x到父親的邊權值=x子樹權值和。
求解x子樹的權值和方法有:df
s序+b
it,樹
形dp,
dfs序
+字尾和
。
在這3種方法中,第3種常數最小,也很方便。
常州模擬賽d2t3 小X的佛光
平日裡最喜歡做的事就是蒸發學水。題目描述 小 x 所在的城市 x 城是乙個含有 n 個節點的無向圖,同時,由於 x 國是一 個發展中國家,為了節約城市建設的經費,x 國首相在建造 x 城時只建造 n 1 條邊,使得城市的各個地點能夠相互到達。小 x 計畫蒸發 q 天的學水,每一天會有一名學水從 a ...
NOIP 2015 day2 T3 運輸計畫
time 2018 9 27 題目大意 資料範圍 1 n m 300000 0 v al 1000 time limit 1000ms memory limit 256mb 1 n,m 300000 0 val 1000 text text 1 n m 3 0000 00 v al 1 000tim...
NOIP2015Day2T3 運輸計畫
題解 二分答案。假設列舉到答案是xxx。找出所有長度大於x xx的鏈,那麼這些鏈上必須要放蟲洞,而且必須放在一條所有鏈都經過的邊上,否則必然有一條鏈的長度是大於x xx的。這個直接差分就能求出所有鏈都經過的邊,並且把最長的那條改為蟲洞,看看所有邊是否合法,則可判斷x xx是否可行。應該不是很難吧。比...