bitset 学习笔记

引入

顾名思义, \(\texttt{bitset}\) 是用 \(\texttt{bit}\) 组成的 \(\texttt{set}\);
区别于普通的 \(\texttt{bool []}\)\(\texttt{vector<bool>}\)\(\texttt{bitset}\) 的每一位都用一 \(\text{bit}\) 的内存来存储,而非一 \(\text{byte}\)
故, \(\texttt{bitset}\) 总是用来卡常。

正题

首先一些介绍一些基础用法:

用法

一些初始化

  • bitset<M> Name:长度为 \(M\)\(\texttt{bitset}\),默认为空。(\(M\) 为常量,下同)
  • bitset<M> Name(N):长度为 \(M\)\(\texttt{bitset}\),初始化为 int 类型的变量 \(N\) 的二进制。
  • bitset<M> Name(S):长度为 \(M\)\(\texttt{bitset}\),初始化为 string 类型的 01 字符串 \(S\)

一些运算符重载

  • operator [] (int i):返回 \(\texttt{bitset}\) 的第 \(i\) 位,但是从右往左数。
  • operator < (bitset<N> b):返回两 \(\texttt{bitset} 比较的结果\)
  • operator > (bitset<N> b):同上。
  • operator << (int t)
  • operator >> (int t)
  • operator & (bitset<N> b)
  • operator | (bitset<N> b)
  • operator ~ ()
  • operator ^ (bitset<N> b)

好吧后面的不想写了,自行脑补()

直接例题。

例题

AT_agc020_c

考虑将所有集合的和都存进一个 bitset 里,如果 Bit[i] != 0 那么就代表存在一个集合的和为 \(i\)

那么可以这样写:

Bit[0] = 1;
for (int i = 1; i <= n; i++) {
	cin >> tmp;
	Bit |= (Bit << tmp);
}

P4306

我们充分发扬人类智慧:

用 bitset 优化 Floyd,\(n^2\) 枚举两点,如果两点联通则将两点可达的所有点取并集。

这样速度快得飞起,在 \(n=2000\) 时都可以在 138ms 内卡过

CF620E

说实话这道题用 bitset 硬往树剖上扣就可以了,不再赘述。

posted @ 2024-10-24 13:32  Reveriean  阅读(37)  评论(0)    收藏  举报