bitset模板题
You cannot submit for this problem because the contest is ended. You can click "Open in Problem Set" to view this problem in normal mode.
题目描述
现有一个位数组(Bitset)容器,支持以下操作:设置某位的值、翻转某位的值、查询某位的值、按位与操作、按位或操作、按位异或操作和统计置位位数。你需要实现这个位数组,并处理可能的边界情况。具体规则如下:
- 设置操作:将指定位设置为指定值(0或1)。
- 翻转操作:将指定位的值取反(0变1,1变0)。
- 查询操作:获取指定位的值。
- 与操作:将当前位数组与另一个位数组按位与,并更新当前位数组。
- 或操作:将当前位数组与另一个位数组按位或,并更新当前位数组。
- 异或操作:将当前位数组与另一个位数组按位异或,并更新当前位数组。
- 统计操作:返回位数组中值为1的位的数量。
操作完成后,需输出最终位数组的二进制表示(从最高位到最低位)。
输入格式
- 第一行输入两个整数
n
(1 ≤ n ≤ 1000000
)和q
(1 ≤ q ≤ 1000000
),分别表示位数组的长度和操作的总次数。 - 初始时,位数组的所有位均为0。
- 接下来
q
行,每行表示一次操作,格式如下:- 设置操作:
1 pos val
(将位置pos
的位设置为val
,val
为0或1,位置从0开始)。 - 翻转操作:
2 pos
(将位置pos
的位翻转)。 - 查询操作:
3 pos
(查询位置pos
的位的值)。 - 与操作:
4 s
(将当前位数组与二进制字符串s
按位与,s
的长度为n
)。 - 或操作:
5 s
(将当前位数组与二进制字符串s
按位或,s
的长度为n
)。 - 异或操作:
6 s
(将当前位数组与二进制字符串s
按位异或,s
的长度为n
)。 - 统计操作:
7
(返回位数组中值为1的位的数量)。
- 设置操作:
输出格式
- 对于每次查询操作(操作3),输出一行:
- 若位置合法,输出该位的值(0或1);
- 若位置不合法,输出
-1
。 - 对于每次统计操作(操作7),输出一行整数,表示位数组中值为1的位的数量。
- 所有操作完成后,输出一行:
- 位数组的二进制表示(从最高位到最低位)。若位数组为空,输出空行。
样例 1 输入
5 6
1 2 1
2 3
4 01010
7
3 3
5 01100
样例 1 输出
1
1
01100
样例说明
- 初始状态:位数组为
00000
。 - 设置操作:将位置2的位设置为1,位数组变为
00100
。 - 翻转操作:将位置3的位翻转,位数组变为
00110
。 - 与操作:与二进制字符串
01010
按位与,结果为00010
。 - 统计操作:值为1的位有1个,输出1。
- 查询操作:位置3的位为0,输出0。
- 或操作:与二进制字符串
01100
按位或,结果为01110
。 - 最终输出:位数组的二进制表示为
01110
。
测试点约束
- 位数组长度
n ≤ 1000000
。 - 操作次数
q ≤ 1000000
。 - 所有位置
pos
满足0 ≤ pos < n
。 - 所有二进制字符串
s
的长度均为n
。 - 注意:字符串第一位是最高位
- 4、5、6操作最多总共出现一次
提示
- 位运算:熟悉按位与、或、异或的运算规则。
- 边界检查:所有涉及位置的操作需检查位置是否合法。
- 高效实现:统计操作的时间复杂度应为O(n)。
7.25造数据
- Status
- Done
- Rule
- IOI
- Problem
- 13
- Start at
- 2025-7-25 18:00
- End at
- 2025-7-25 21:00
- Duration
- 3 hour(s)
- Host
- Partic.
- 9