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 硬往树剖上扣就可以了,不再赘述。

浙公网安备 33010602011771号