二进制集合

二进制集合是一种神奇的集合,因为集合里的元素只有在和不在两种状态,所以可以用二进制的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,,N1}
(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)
集合ST的并集ST
S|T
集合ST的交集ST
S&T

 

好了扯回正题

这就是二进制集合的用法,对于一些枚举操作具有重要意义

刚做完一道luogu题:打开所有的灯,用到了广搜和二进制集合判重

来试试呀 

(喂你这是刚转回正题就结束了吧)

posted @ 2017-05-10 15:26  Konoset  阅读(999)  评论(0编辑  收藏  举报