NOI2019 彈跳 區間連邊最短路問題

2021-10-06 20:57:51 字數 1424 閱讀 6628

loj3159 n

nn個點,每個點有乙個二維座標,有m

mm條邊,每條邊從乙個點出發,可以走到座標範圍在乙個矩形區域內的點,代價為t

it_i

ti​。求從1號點到其他點的最短路。

n ≤7

∗104

,m

≤1.5∗1

05

n\le7*10^4,m\le1.5*10^5

n≤7∗10

4,m≤

1.5∗

105提供兩種做法。

如果問題是一維,容易想到線段樹優化建邊,二維就是二維線段樹,然而空間是n

log⁡2n

n\log^2n

nlog2n

的。所以使用kd樹。

對乙個矩形連邊就是kd樹上找矩形。kd樹上的點向兩個兒子連邊權為0的邊。

然而直接將邊建出來仍然無法承受,因為點找矩形的邊可能達到o(n

n)

o(n\sqrt n)

o(nn​)

級別。可以不將邊實際建出來,而只是利用kd樹進行轉移,當優先佇列的堆頂是實點時進kd樹修改對應矩形的距離,當堆頂是kd樹上的點時就加入兩個兒子。

這樣做的理論複雜度雖然是o(n

nlog⁡n

)o(n\sqrt n\log n)

o(nn

​logn)

,但是因為進kd樹修改矩形時有較多的剪枝,因此實際執行效果優異,loj上目前最快的解法就是這個,比如

注意到dijkstra邊權非負的貪心性質,如果當前優先佇列的堆頂是表示的是乙個矩形,它離1號點的距離為d

dd,那麼它到矩形內的邊權都是0,那麼矩形內還沒有被其它矩形更新的點的距離都會被確定為d

dd,於是就可以把它們從待更新的區域刪掉。

用資料結構實現上述過程,就是每次找出乙個矩形內的點,將它們的距離全部更新為d

dd,然後刪除這些點(或者打上標記不會再被更新)。刪除的點在此題中不用放進優先佇列,可以直接把它們對應的矩形加上邊權後放入優先佇列。

找矩形以及刪除可以用線段樹套set

setse

t輕易完成(線段樹表示第一維,set表示第二維,用set是因為它的空間複雜度是o(n

)o(n)

o(n)

的),**複雜度極小。當然也可以使用kd樹打標記。

前者的時間複雜度是o(n

log⁡2n

+m

log⁡m)

o(n\log^2n+m\log m)

o(nlog2n

+mlogm

),code:

後者的複雜度是o(m

n+

mlog⁡m

)o(m\sqrt n+m\log m)

o(mn​+

mlogm)

。但是感覺kd樹會跑得更快(大常數set

setse

t)。

NOI2019 彈跳 題解(KD樹)

題意 w h網格中有n個點,m條邊。每條邊可以從p點花費t時間到乙個矩形中的任意點,求1號點到每個點的最少時間。1 w,h n 70000,1 m 150000 時間2s,空間128m。本題如果放在序列上,使用線段樹建圖,可以做到 o mlogn 的複雜度,通過資料分治可以獲得72分。對於二維問題可...

NOI2019模擬2019 3 18 總結

今天的比賽再次打爛了 見識到了自己和外校大佬們的差距 t1一看就感覺不是什麼友善的題 t2感覺是貪心或者dp t3是個類似組合數的遞推,但是直接轉移顯然會t,感覺有可能可以用多項式來做,又想不出來 心態就徹底崩了 推了1ht3的式子,無果,暴力走人。t2又玩了1h,猜了一發結論,搞了個lis之類的東...

NOI2019十二省聯考 記

沒什麼好說的 上海300是開放的省份中最便宜的 了解了太頹了 都沒有心情腐敗了 在朋友圈雲上海遊 不是這個上海市選怎麼這麼隨便啊 座位安排都沒有隨便坐,密碼不知道就直接把整個包發過來 第一遍讀題,這個c把我嚇壞了 這tm真的不是愚人節比賽?冷靜了一下決定先去淦前兩題,不碰這個c 結果a是一眼題,b也...