推 ckc1ark: 不一定要改heap現有的 放新產生的頭尾進去即可 11/08 12:30
你說的我有想過,不過不把因為合併的點刪除時會導致整個 HEAP 根據長度排序會出問題
如果是要根據合併後的 Group ID 長度為統一時,代表需要同步調整個 HEAP 當中
屬於這個 Group 的其他點確保 HEAP 的架構正確。
推 ucrxzero: 跨謀 11/08 15:03
※ 編輯: fatcat8127 (61.222.86.91 臺灣), 11/08/2020 22:59:37
推 ckc1ark: 我heap存的是(len, left, right) 再用輔助的array很快就 11/09 00:26
→ ckc1ark: 知道目前看到這個是不是過時的 11/09 00:26
→ ckc1ark: 反正n變兩倍不影響heap複雜度 11/09 00:27
後來想到可以用 multiset(存在多個長度相同的Group)+struct(定義小於=根據長度排序)
muiltiset.find() 可以找到指定的 struct,可以直接 erase,
但是找到的 struct 是 read-only,所以更新某個已經存在的 Group 長度時,
需要 erase older version + insert new version(after updating)。
這邊附上實作的程式:https://www.codepile.net/pile/gaWjg6vb
※ 編輯: fatcat8127 (61.222.86.91 臺灣), 11/09/2020 12:30:51
→ ckc1ark: combo裡的值存每段紅色彩帶的長度(僅兩端) 非兩端不重要 11/09 13:04
推 ucrxzero: 好想跟著寫但我連leetcode 都快寫不完了 11/09 15:56
推 DJWS: O(nk)不行嗎? 那就O(kk)吧! 排序所有區間、插入排序法 11/11 10:40
→ DJWS: O(kk)不行嗎? 那就O(klogn)吧! 來一發線段樹就搞定了 11/11 10:44
→ DJWS: O(klogn)不行嗎? 那就O(klogk)吧! 二元樹紀錄所有區間 11/11 10:48