[CF878D] Magic Breeding 題解
阿新 • • 發佈:2022-05-25
又是一道 bitset
科技題,但是思維難度也還是很高的。
考慮先弱化一下題目,如果特徵只有 \(0/1\) 該怎麼做,考慮對於 \(0/1\) 來說,\(\min/\max\) 可以看成 \(\operatorname{bitand}/\operatorname{bitor}\) 操作,那麼我們考慮如果將所有生物的一種特徵單獨做會怎麼樣,現在的問題就變成了給定一個數組,每次新生成一個元素表示為之前選取兩個值的 \(\operatorname{bitand}/\operatorname{bitor}\),現在的情況是因為有 \(10^5\) 種特徵,每一位單獨做時間複雜度無法接受,但是發現因為初始陣列只有 \(12\)
bitset
的 &
和 |
操作加速,性質非常優秀。
考慮如何將 \(10^9\) 的值域轉化成 \(0/1\),這可以說是一個經典套路,首先我們發現因為初始只有 \(12\) 個值,而 \(\min/\max\) 操作不會產生新的值,所以值最多隻有 \(12\) 種,對於將大值域轉化成 \(0/1\) 一個經典的手段在二分時經常用到,就是設一個閾值 \(\text{limit}\),如果一個值比 \(\text{limit}\) 小就是 \(0\),否則就是 \(1\),這裡我們也可以照用,我們一共有 \(12\)
bitset
優化,然後查詢操作直接從大到小列舉閾值更新 \(sta\) 直到答案為 \(f_{i,sta}=1\)程式碼並沒有想象中那麼難。