二进制集合是一种神奇的集合,因为集合里的元素只有在和不在两种状态,所以可以用二进制的0或1来分别模拟元素是否在集合内
比如说一个有三个元素的集合
三个元素都不在集合里的时候怎么表示? 000对吧
把000转成十进制就是0
如果第一个元素在集合里呢?001?
转成十进制就是1
同理 写出这个栗子的所有子集
集合 十进制对应数码
000 0
001 1
010 2
100 4
011 3
101 5
110 6
111 7
用二进制表示的东西就是优美
所以发现规律了没? 对于最多有n个元素的集合来说,空集用0表示,满集用2^n-1来表示
那2的n次方减1怎么表示呢?有个叫位运算的东西(相信大佬们肯定很熟悉)什么 1<<m等价于2^m,m>>1等价于m/2
原理不明反正很厉害就是了
所以2的n次方减1就是(1<<N)-1 注意位运算符比加减号优先级低,所以用括号括起来。要不然你就是在算2的n-1次方
然后放出所有的二进制集合操作(来自Netcan_Space)
空集∅ |
0 |
全集{0,1,⋯,N−1} |
(1<<N)-1 |
只含有第i个元素的集合{i} |
1<<i |
判断第i个元素是否属于集合S |
if(S>>i & 1) |
向集合中加入第i个元素S∪{i} |
S|1<<i |
从集合中去掉第i个元素S∖{i} |
S&~(1<<i) |
集合S和T的并集S∪T |
S|T |
集合S和T的交集S∩T |
S&T |
好了扯回正题
这就是二进制集合的用法,对于一些枚举操作具有重要意义
刚做完一道luogu题:打开所有的灯,用到了广搜和二进制集合判重
来试试呀
(喂你这是刚转回正题就结束了吧)