ORACLE 查詢表資訊
\(k-D Tree\) 是一種可以 高效處理 \(k\) 維空間資訊 的資料結構。
在結點數遠大於 \(k\) 時,應用 \(k-D Tree\) 的時間效率很好。
—— OI Wiki
對於建樹,主流寫法是平衡樹版,時空複雜度較小,由於本人碼力過於匱乏,所有實現均採用線段樹版
每次折半理論上應該計算方差,然而一般橫縱座標交替處理的表現已經足夠優秀
由於在多數情況下 \(k-D tree\) 的理論複雜度並不正確,所以應該儘量多的使用各種剪枝,尤其是左右兒子遞迴順序的判斷上
應用之一是尋找點與點的關係
進入每個子樹時判斷這個子樹表示的舉行與當前點的最大/小距離是否足以更新答案,如果不行直接返回
又是一個神奇的套路
要求 \(k\) 遠點,那麼開個堆儲存當前最大的 \(k\) 個元素,每次替換對頂
在 \(KDT\) 上像線段樹一樣 \(update\),儲存子節點的和
用一樣的方式在進入時用邊界點進行剪枝
首先明確 \(KDT\) 只能維護點,那麼把所有點插入
將所有矩形從低到高列舉,匹配子樹內滿足條件的編號最小的點
注意匹配後需要將點刪除,即把權值設為正無窮
一定要注意的一點是由於建樹過程中一直在 \(nth\_element\),所以原陣列的下標一直在變,應當以編號為基準
如果涉及強制線上的動態插入,很可能讓整棵樹變得極不平衡
既然不能旋轉,只好採用類似於替罪羊樹的方式進行重構
發現加了個第 \(k\) 大的操作,那麼轉化為線段樹(二分)套 \(KDT\)
線上段樹每個節點的 \(KDT\) 中插入新點,並且分別重構
查詢時進入左右兒子時二分判斷
由於線段樹版本常數過大,至今沒有在洛谷上卡過去……
首先將所有詢問離線,將矩形動態插入,同時更新每個點最右的操作
開另一個數據結構去維護這件事情,應當轉化為維護最右操作為 \(i\) 的點的權值和
覆蓋時線上段樹上用當前標記更新以前標記時把以前標記產生的貢獻消除
複雜度均攤下來是正確的
由於 \(KDT\)