首页 > 试题广场 >

位运算?位运算!

[编程题]位运算?位运算!
请实现一个数据结构支持以下操作:
区间循环左右移,区间与,区间或,区间求和。

输入描述:
第一行n,q表示数列长度及操作次数。
第二行n个数表示初始序列。
接下来q行表示操作。
操作格式如下:
一行表示一个操作。所有操作形如 opt l r v。
opt=1 表示将区间[l,r]循环右移v位。
opt=2 表示将区间[l,r]循环左移v位。
opt=3 表示将区间[l,r]按位或上v。
opt=4 表示将区间[l,r]按位与上v。
opt=5 询问区间[l,r]的和。
保证opt=1或2时 1 ≤ v ≤ 20
注意:为了优化你的做题体验,操作5也会输入一个v,但是是没有意义的。
注意:循环左右移在20个二进制位的意义下进行


输出描述:
对于每个opt=5的操作,输出一个数表示答案。
示例1

输入

10 10
10112 23536 1305 7072 12730 29518 12315 3459 12435 29055
4 5 10 12373
2 1 6 7
5 4 10 24895
1 1 4 8
5 3 7 7767
5 7 9 6127
4 2 8 30971
5 4 10 2663
1 7 10 1
1 2 9 5

输出

2001530
1600111
24611
49482

备注:
1 ≤ N,Q ≤ 2*105 0 ≤ ai < 220
一些说明:
1. 对于00000000000000000101,右移一位后会变成10000000000000000010
2. 不是区间位移,是区间中的每一个数的二进制位的位移
头像 耕云种月
发表于 2022-01-30 19:36:02
原题解链接:https://ac.nowcoder.com/discuss/149990 我们发现,这些位运算都是按位独立的,也就是说,我们可以将每一位分别维护, 而不是维护整个数字。 那我们可以先拆位,然后依次考虑如何实现这几个操作。 首先先看区间与,假设我们现在要与上xxx,操作的区间是[l,r 展开全文