1. 程式人生 > >2018.10.26 NOIP模擬 圖(最小生成樹+線段樹合併)

2018.10.26 NOIP模擬 圖(最小生成樹+線段樹合併)

傳送門 首先最開始說的那個一條路徑的權值就是想告訴你兩個點之間的貢獻就是瓶頸邊的權值。 那麼肯定要用最小生成樹演算法。 於是我考場上想了30min+30min+的樹形dpdp 發現轉移是優秀的nlognnlog_n,總時間複雜度O(n2logn)O(n^2log_n)妙啊 然後有了棄療的想法。 突然想到沒有利用kruskalkruskal演算法的性質。 其實就是一個kruskalkruskal重構樹用到的思想,對於兩個連通塊,當前這條將它們連線起來的邊是兩個連通塊的點連通的瓶頸 這就好辦了。 只用算出這條邊貢獻了幾次就行了。 咦線段樹合併可做啊總複雜度O

(nlogn2)O(nlog^2_{n})妙啊 咦等等好像啟發式合併更好寫啊。 咦等等… 終於等到了一個妙不可言的時刻。 我發現題目給的式子可以變形啊! 設對於限制CuCvL|C_u-C_v|\geq L中較大的數為xx,較小的數為yy. =>xy+Lx\geq y+L =>x>y+L1x>y+L-1 那麼對於所有點,我們將CiC_iCi+L1C_i+L-1共同離散化。 然後對CiC_iCi+L1C_i+L-1分別維護兩種權值線段樹。 之後直接線段樹合併就行了。 時間複雜度O
(nlogn)O(nlog_n)
吊了標算?妙啊 放一波程式碼