D2T3 運輸計畫

2021-07-24 14:32:41 字數 1578 閱讀 6472

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是否可行。應該不是很難吧。比...