[學習筆記]線段樹優化建圖


一個點向一個點連邊太easy了。

現實有的時候並沒有這么簡單。

 

對於這樣的一類問題:
需要多次(m=1e5次左右)從一個編號在[L1,R1]的區間內的所有點,向另一個編號在[L2,R2]的所有點之間分別連權值相同的邊。

求S到T的最短路,或者其他的信息。

就是一個建圖的輔助工具。解題具體思想還是靠圖論。

 

暴力連邊是O(mn^2)的。時空不足。

對於區間連邊,我們考慮處理區間問題的大殺器:線段樹。

具體做法如下:

建造兩棵線段樹A,B

A保存入的信息,B保存出的信息。

到了A的某個節點,代表進入了這個點所代表的區間,位置可以認為是區間所有的包含點的疊加態。

到了B的某個節點,代表可以從這個點代表的區間中的任意一個邊出去。

連邊:

1.A樹父親向兒子連0邊,能夠進入父親節點,必然就可以選擇進入兒子節點。疊加態具體化。

2.B樹兒子向父親連0邊,兒子屬於父親節點,父親節點代表區間連出去邊,兒子節點也一定可以走。

3.A樹B樹間的平行節點之間,由A向B連0邊,代表,我進入A點,必然可以選擇從A點出去。

4.對於題目要求加入的邊(真邊),建立虛擬節點P,在B中把出區間拆成logn份,分別連接到P點,邊權為0

  在A中把入區間拆成logn份,點P分別連接到這些區間,邊權都是val

  (當然,邊權可以反過來)

然后跑最短路即可。

邊數:O(2*2*n+m*logn*2)

點數:O(2*2*n+m)

 

模板題:CF786B

 

當然,也要解決一些其他抽象的問題:

 

[POI2015]PUS

 

以及炸彈:

bzoj 5017 炸彈 線段樹優化建圖+tarjan+拓撲排序

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM