题解:蓝桥云课 3691 区间或
【题目来源】
蓝桥云课:1.区间或 - 蓝桥云课 (lanqiao.cn)
【题目描述】
给定一个长度为 \(n\) 的数组 \(a\)。现在有 \(q\) 次询问,给出两个整数 \(l\) 和 \(r\),求 \(a[l];|;a[l+1];…;a[r-1];|;a[r]\) 的值,其中 \(|\) 代表按位或。
【输入】
第一行两个整数 \(n,q\) 分别数组的长度和询问次数。
接下来一行 \(n\) 个整数,\(a_1,a_2,…,a_n\),表示数组 \(a\)。
接下来 \(q\) 行:
每行两个整数 \(l,r\),代表询问给出的区间。
【输出】
对于每一次询问,输出一个整数表示结果。
【输入样例】
5 2
1 2 3 4 5
1 5
2 3
【输出样例】
7
3
【算法标签】
《蓝桥云课 3691 区间或》 #前缀和# #位运算#
【代码详解】
#001,010,011,100,101
#第0位:[1,0,1,0,1]
#第1位:[0,1,1,0,0]
#第2位:[0,0,0,1,1]
from itertools import accumulate
n, q = map(int, input().split())
a = list(map(int, input().split()))
import sys
input = sys.stdin.readline
#第0位到第30位
a_bit = []
for i in range(31):
#求a数组中的每个数字的第i位,为0还是为1
now = []
for x in a:
now.append((x>>i) & 1)
a_bit.append(list(accumulate(now))+[0])
for _ in range(q):
l, r = map(int, input().split())
l, r = l-1, r-1
ans = 0
#每一位单独考虑,对于第i位而言,只需判断[l,r]的和是否大于0
for i in range(31):
#只需判断[l,r]的和是否大于0
#a_bit[i][r] - a_bit[i][l-1] > 0
# if l==0:
# now = a_bit[i][r]
# else:
# now = a_bit[i][r] - a_bit[i][l-1]
if a_bit[i][r] - a_bit[i][l-1] > 0:
ans += (1<<i)
print(ans)
【运行结果】
5 2
1 2 3 4 5
1 5
7
2 3
3
浙公网安备 33010602011771号