STL用法总结
bitset
超级好用的东西.由于内存地址是按字节即 byte 寻址,而非比特\(bit\) ,一个 \(bool\) 类型的变量,虽然只能表示 \(0/1\) , 但是也占了 \(1byte\) 的内存。
bitset 就是通过固定的优化,使得一个字节的八个比特能分别储存 \(8\) 位的 \(0/1\)。
对于一个\(4\)字节的 int 变量,在只存 0/1 的意义下,bitset 占用空间只是其 \(\frac{1}{32}\),计算一些信息时,所需时间也是其 \(\frac {1}{32}\)。
函数:
bitset<N> jg;//开一个大小为N的bitset
bitset.set()//全设为1
bitset.reset()//全设为0
jg[pos]//访问第pos位的值(从0开始)
| & >> << //左移右移一定要自己模拟一下
jg._Find_next(pos)//找在pos位后面的第一个1,(不包括pos本身)
jg._Find_first()//找第一个1(从低到高)
jg.none()//是否全是0
jg.all()//是否全是1
jg.any()//是否有1
jg.count()//一的个数
jg.test(pos)//检测pos位是否为1
jg.flip()//反转所有位
jg.flip(pos)//反转pos位
jg.to_ullong()//返回转换为unsigned long long 的结果
应用:
1.bitset配合埃式筛比 \(O(n)\) 更快。
bitset<N> vis;
void ycl()
{
vis[1]=0;
for(int i=2;i*i<=n;i++)//后面一定没用
if(!vis[i])
for(int j=i*i;j<=n;j+=i)//2*i一定被前面标记了。
vis[j]=1;
for(int i=2;i<=n;i++)if(!vis[i])prim[++cnt]=i;
}
2.bitset配合莫队
因为莫队的一次修改是O(1)的与bitset很切合,所以可以在用莫队的同时用bitset,实现一些别的东西。
如这道题
3.储存是否存在的DP(如0/1背包)
一个数有没有出现过。(树上)
for(int i=0;i<len;i++)
{
int v=ve[u][i];
if(v==fa)continue;
ff=jg<<siz[v];
jg|=ff;
}