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
log2n
n\log^2n
nlog2n
的。所以使用kd樹。
對乙個矩形連邊就是kd樹上找矩形。kd樹上的點向兩個兒子連邊權為0的邊。
然而直接將邊建出來仍然無法承受,因為點找矩形的邊可能達到o(n
n)
o(n\sqrt n)
o(nn)
級別。可以不將邊實際建出來,而只是利用kd樹進行轉移,當優先佇列的堆頂是實點時進kd樹修改對應矩形的距離,當堆頂是kd樹上的點時就加入兩個兒子。
這樣做的理論複雜度雖然是o(n
nlogn
)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
log2n
+m
logm)
o(n\log^2n+m\log m)
o(nlog2n
+mlogm
),code:
後者的複雜度是o(m
n+
mlogm
)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也...