1. 程式人生 > >帶權二分-一丟丟感悟

帶權二分-一丟丟感悟

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 林克卡特樹 也是這個方式考慮第二關鍵字(沒有這個東西,是我口胡的)。

帶權二分-一丟丟感悟