给学弟的bitset使用整理
Bitset就是一个01串,空间为bool的八分之一
每一位占有一个bit,支持数组式单点修改,左右位移,位运算等操作
时间复杂度 单次操作时间复杂度为O(n/w),w为计算机字长(一般为32或64)
声明 bitset<maxn> now;
支持初始化 bitset<maxn> now(string("00110101"));
内部下标零开始,从右向左记录,初始化后将字符串记录到最右侧,左侧不足的补零
单点修改 s[pos] = x;
左移 s << x;
支持 <<=和>>=
支持与、或、异或运算 & | ^
成员函数
.reset() 集合内元素全部清零
.set() 集合内元素全部置1
.set(pos) 从右往左pos位置改为1 单点操作O1
.set(pos,v) 从右往左pos位置改为v//只能是1/0
.test(pos) 返回pos位置的值 单次操作O1
.any() 返回一个布尔量 若内部存在一位值为1,返回true
复杂度同上
.none() 返回一个布尔量 若内部存在一位值为0,返回true
.count() 返回一个bitset内1的个数 O(n/w)
.flip() 所有元素按位取反
.flip(x) 对第x位取反
例题
没有传送门。。。自己搜一下
莫队 + bitset
洛谷 人渣的本愿
01背包 bitset优化
bitset<maxn>b;
cin>>n;b[0]=1;
for(int i=1;i<=n;++i){
cin>>a[i];
b|=(b<<a[i]);
}
此时 b[ x ] 可以检验 x 大小 的 容量的背包是否被填满
洛谷 三维偏序
(这个我也不太会
bitset 优化线段树
数学家的谜题
储存状态
可以用bitset存一些比较大的状态,查询修改也比较快
牛客之前写过一题,但是我找不到了,太久了
支持与、或、异或运算