關於 bitset 的一些題目

參考

bitset

bitset<MAXN> b;
b.any()    // b中是否存在置爲1的二進制位。
b.none()   // b中是否不存在置爲1的二進制位。
b.count()  // b中置爲1的二進制位的個數。
b.size()   // b中二進制位數的個數。
b[pos]     // 訪問b中在pos處二進制位。
b.test(pos) // b中在pos處的二進制位置爲1麼?
b.set()    // 把b中全部二進制位都置爲1。
b.set(pos) // 把b中在pos處的二進制位置爲1。
b.reset()  // 把b中全部二進制位都置爲0。
b.reset(pos) // 把b中在pos處的二進制位置置爲0。
b.flip()  // 把b中全部二進制位逐位取反。
b.flip(pos)  // 把b中在pos處的二進制位取反。
b.to_ullong() // 返回一個有相同二進制位的 unsigned long long 類型的值。

想法

通常先考慮題目的暴力作法,若是複雜度有 \(1e9\) ,這時候就可能考慮 \(bitset\) 優化,通常題目中的關係相似於能不能?是否是?這種,或者能夠用 \(bitset\) 優化 \(DP\)(揹包 \(DP\) 比較多,或者用於記錄路徑之類) ,一個有趣的應用是對於一些字符串問題,字符串長度不長,可是動態更新,詢問次數不少的狀況,能夠維護 \(bitset\) 進行快速求解。php

題目

  • Triatrip
  • Bipartite Graph 顯然二分圖兩邊點數要儘量相同,考慮 01揹包DP, \(bitset\) 優化,二進制位 \(i\) 表示是否能構成點數量爲 \(i\) 的一邊。
  • Addition on Segments 先進行相似於線段樹的更新操做,而後用 \(bitset\) 加速狀態轉移。
  • Explosion \(bitset\) 加速傳遞閉包的計算。
  • Eighty seven 考慮前綴後綴,開兩個 \(bitset\) 類型的 \(DP\) 數組,之前綴爲例,\(dp[i][j][k]\) 表示到第 \(i\) 個數,必定不選 \(j\) 這個位置上的數,選了 \(k\) 個數時全部可能的和(二進制位爲\(1\)表示有這樣的和)。對於後綴的數組,若是二進制位 \(i\) 上的數字爲\(1\),可修改成 \(bit[87-i]=1\),那麼對於詢問,枚舉 \(k\) ,將前綴後綴按位與,檢查是否有二進制位爲\(1\)
  • Price List Strike Back
  • Judgement 01揹包 \(DP\)\(bitset\) 記錄路徑。
  • 帶可選字符的多字符串匹配 \(bitset\) 加速匹配。預處理不一樣字符可能出現的集合,若是到主串上的第 \(i\) 個字符,有 \(bit[j]=1\) 表示已經匹配了長度爲 \(j\) 的模板串。\(bit<<1\) 等價於加入一個新的字符,利用前面的預處理能夠判斷轉移是否合法(按位與),若不合法則對應的二進制位會變成 \(0\)
  • The Values You Can Make 揹包 \(DP\)
  • La Vie en rose \(bitset\) 優化字符串匹配。
  • Nearest Maintenance Point 在最短路搜索的過程當中使用 \(bitset\) 記錄信息,表示從哪些點到當前點有最短路。
  • Rikka with Candies 離線查詢。因爲 \(a \% b = k\)\(0\leq k < b\),咱們能夠從大到小枚舉這個 \(k\) ,統計答案,而後更新 \(bitset\)\(k\) 的倍數。
相關文章
相關標籤/搜索