帶權二分-一丟丟感悟
阿新 • • 發佈:2019-02-22
lse pda 不同 code 可能 math upd 邊界條件 update
問題:邊界條件的考慮方式,權值相等時,第二關鍵字應該是最大化還是最小化。
用 hzwer 的選 \(k\) 個白點那道題來說吧,給每個白點增加 \(mid\) 的權值,計算 MST 的白點數量 \(cnt\) 。
\(mid\) 增大, \(cnt\) 減小,二分大概長這樣:
while (l <= r) { cnt = check(mid); if (cnt <= k) { // update ans r = mid - 1; } else { l = mid + 1; } }
類似一個單調不升的序列,二分一個值,最後肯定是停在一段連續相同的值的左邊(因為 \(cnt = k\) 的時候還在減小 \(mid\) )。
如此能保證的只有 \(mid - 1\) 位置的 \(cnt > k\) ,它是非法的。
這種非法情況,應該無論如何都非法。就是說 \(mid - 1\) 位置對應的各種 \(cnt_{min}, \cdots, cnt_{max}\) ,都大於 \(k\) (否則合法的情況就可能在 \(mid - 1\) 位置,這時候該選 \(mid\) 還是 \(mid - 1\) 就說不清了),所以應該保證 \(cnt_{min}>k\) 才正確。
說完了。
具體放到題裏面,求 \(cnt\) 時,點權相同時,最小化 \(cnt\) 。反過來說有人二分裏面更新答案時用的是 cnt >= k
, 那就應該優先選白點,計算 \(cnt_{max}\) 。
似乎大佬們有不同的解釋,不過暫時我只能這樣理解,似乎沒什麽問題。八省聯考 2018 林克卡特樹 也是這個方式考慮第二關鍵字(沒有這個東西,是我口胡的)。
帶權二分-一丟丟感悟