本文最后更新于 194 天前,如有失效请评论区留言。
题解
模板:
cnt = dict()
for i, x in enumerate(nums):
cnt = {or_ | x : left for or_, left in cnt.items()}
cnt[x] = i
for or_, left in cnt.items():
......
练习:https://www.lanqiao.cn/problems/1595/learning/?page=1&first_category_id=1&name=%E5%92%8C%E4%B8%8E
只过了一半,超时了
import sys
from itertools import accumulate
from collections import defaultdict
input = lambda: sys.stdin.readline().rstrip()
ii = lambda: int(input())
lii = lambda: list(map(int, input().split()))
def solve():
n = ii()
arr = lii()
cnt = defaultdict(list)
ans = 0
pre = list(accumulate(arr, initial=0))
for i, x in enumerate(arr):
temp_cnt = defaultdict(list)
for oo in cnt:
temp_cnt[oo * x].extend(cnt[oo])
temp_cnt[x].append(i)
for oo in cnt:
for left in cnt[oo]:
if pre[i + 1] - pre[left] == oo:
ans += 1
return ans
print(solve())
[========]
扩展:
这类问题也可以使用ST表加二分查找
ST表:
class SparseTable:
def __init__(self, data: list, func=lambda x, y: x | y):
self.func = func
self.st = [list(data)]
i, n = 1, len(self.st[0])
while 2 * i <= n:
pre = self.st[-1]
# 这里用的是倍增的思路,比如一步的时候知道 01 12 23, 两步的时候就是0123, 12是没有价值的
self.st.append([func(pre[j], pre[j + i]) for j in range(n - 2 * i + 1)])
i <<= 1
# st 表的行i代表步长,列j代表左端点,比如st[1][2] 表示[2, 2+1]的统计值
def query(self, begin: int, end: int): # 查询闭区间[begin, end]的最大值
lg = (end - begin + 1).bit_length() - 1
return self.func(self.st[lg][begin], self.st[lg][end - (1 << lg) + 1])