题解:蓝桥云课 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
posted @ 2026-03-04 15:13  团爸讲算法  阅读(0)  评论(0)    收藏  举报