牛客多校2 - Greater and Greater(bitset优化暴力)
題目鏈接:點擊查看
題目大意:給出一個長度為 n 的數組 a ,再給出一個長度最大為 m 的數組 b,現在問在 a 中所有長度為 m 的子數組中,有多少個子數組滿足每個相應的元素都大于數組 b
題目分析:很顯然的一個暴力時間復雜度是 n * m 級別的,高達 6e9 ,但是除以 32 后,時間復雜度好像就在可行范圍內了,所以需要利用 bitset 優化一下
參考博客:https://www.cnblogs.com/whitelily/p/13311327.html
首先對于數組 b 的每個元素維護一個長度為 n 的bitset,假設 bit[ i ] 是 b[ i ] 所維護的的 bitset,bit[ i ][ j ]?= 1 當且僅當 a[ j ] 大于等于 b[ i ]
不難看出,如果長度為 m 的 a 的一個子數組滿足條件,需要滿足 a[ i ] >= b[ j ] && a[ i + 1 ] >= b[ j + 1 ] && ... && a[ i + m - 1 ] >= b[ j + m - 1] ,換句話說需要 bit[ i ][ j?] = bit[ i + 1 ][ j + 1 ] = ... =? bit[ i + m - 1 ][ j + m - 1 ] = 1 同時成立,如果將 bit[ i ][ j ] 放在一個二維平面中去,顯然上述條件涉及到的 m 個 bit 元素位于一條斜率為 1 的斜線上,換句話說,上述條件也等同于 bit[ i ][ j ] & bit[ i + 1 ][ j + 1 ] >> 1 & ... & bit[ i + m - 1 ][ j + m - 1 ] >> ( m - 1 ) 成立,這樣在求出 bit 數組后,?m 個 bit 數組進行 與 運算后?1 的個數就是答案了
但構造 bit 數組樸素的話需要 n * m 的時間復雜度,顯然是不可以的,不難發現,如果 b[ i ] > b[ j ] ,當 bit[ j ] 已經轉移完畢時,bit[ i ] 僅需要在 bit[ j ] 的基礎上再轉移就可以了,基于此,我們可以將數組 a 和數組 b 排序后雙指針轉移,這樣時間復雜度就降低到了 O( n + m )
因為維護 m 個 bit 數組的 與 運算還是需要 n * m 的時間復雜度的,所以總的時間復雜度為?
代碼:
?
?
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的牛客多校2 - Greater and Greater(bitset优化暴力)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牛客多校2 - All with Pai
- 下一篇: 牛客多校2 - Keyboard Fre