/ Vijos / 题库 /

二进制表示集合

二进制表示集合

时间限制:1秒  内存限制:256M


【题目描述】

  可以用二进制来表示{0,1,2,...,n-1}的子集S:在从右向左第i位(各位从0开始编号)表示元素i是否在集合S中(1表示“在”,0表示“不在”)。如下图展示了二进制0100011000110111是如何表示集合{0,1,2,4,5,9,10,14}的。。
说明
  注意:为方便处理,最右边的位总是对应元素0,而不是元素1;

  二进制可以转换为十进制,C++也提供了专门的位运算符。所以,在编程中,时常用整数对应的二进制表示集合,并用位运算来实现集合的相关操作。

【输入格式】

  第一行输入 \(n\),表示全集 \(All={0,1,2,...,n-1}\);
  第二行输入整数 \(S\),表示 \(All\) 的一个子集。
  第三行输入整数 \(T\),表示 \(All\) 的另一个子集。
  第四行输入一个 \(0..n-1\) 范围的整数 \(x\),表示一个元素。

【输出格式】

  第一行,如果元素 \(x\) 属于集合 \(S\),输出 Y,否则输出 N;如果 \(x\) 属于 \(S\),则再输出从 \(S\) 中删除 \(x\) 后的子集。如果 \(x\) 不属于 \(S\),则再输出把 \(x\) 加入 \(S\) 后的子集。
  第二行,如果 \(T\) 是 \(S\) 的子集,则输出 Y,否则输出 N;
  第三行,输出 \(S\) 与 \(T\) 的交集和并集;
  第四行,输出 \(S\) 的所有元素;
  第五行,输出 \(S\) 的所有非空子集(由大到小的顺序);

【输入输出样例】

 Input

5
23
5
2

 Output

Y 19
N
1 23
0 1 4 
19 18 17 16 3 2 1 

【数据限制】

  - 对于 \(100\%\) 的数据,\(1≤n≤20\),\(1≤S,T≤2^{20}\),

【来源】

  Mr.he

信息

ID
3194
难度
9
分类
模拟 点击显示
标签
(无)
递交数
3
已通过
1
通过率
33%
被复制
2
上传者