关于bitset
bitset 的用法
bitset 是一个存 0/1 的大小不可变的容器,它的空间效率和时间效率极其快,快 32 倍,所以会被用于一些暴力优化成正解。
个人的理解,这个东西把一大堆压到了一块,相当于一个小分块,所以才变快了,手写一个也就是把一个 ull 当作 64 个位置存。
记一下这个玩意的用法吧。
声明
声明也就很简单。
点击查看代码
bitset <MN> s;
别忘了这个是固定大小的。
访问,修改
支持下标访问
点击查看代码
s[0]=1;
cout<<s[114514]<<'\n';
这个东西也支持各种各样的位运算。
点击查看代码
s<<=x;
s>>=x;
s&=s1;
s|=s1;
s^=s1;
这基本上就够用了。
一些函数
这边仅仅写一些自认为有用的。
重置用 reset, 全都便成 0。
点击查看代码
s.reset();
大规模设置用set, 第一个参数是 pos, 第二个参数是 val;
如果什么都不传默认把所有的位置都设为 1, 时间复杂度 \(O(\frac{n}{w})\)
点击查看代码
s.set();
s.set(1);
s.set(1,0);
any 如果存在1就返回 true;
点击查看代码
cout<<s.any();
none 如果都是 0 返回 true。
点击查看代码
cout<<s.none();
all 如果全部都是 1 则返回 true。
点击查看代码
cout<<s.all();
count 返回 1 的个数
点击查看代码
cout<<s.count();
flip 对每一位取反,如果加上 pos 就是这一位。
点击查看代码
s.flip();
s.flip(1);
_Find_first 会返回第一个 1 的位置,不存在返回大小。
点击查看代码
cout<<s._Find_first();
_Find_next 返回位置严格大于 pos 的第一个 1 的位置。
点击查看代码
cout<<s._Find_next(1);

浙公网安备 33010602011771号