【发布时间】:2020-09-16 13:22:11
【问题描述】:
我正在尝试以下问题,在多个小时内多次提交后,我仍然无法让我的解决方案及时运行
问题 https://codeforces.com/problemset/problem/339/D
我的解决方案
def getInts():
return [int(s) for s in input().split()]
class SegmentTree(object):
def __init__(self, arr):
self.arr = arr
self.tree_size = 2 * len(arr) - 1
self.tree = [0] * self.tree_size
self.build_tree(arr)
def build_tree(self,arr):
len_A = (self.tree_size+1)//2
zz = len_A-1
for j in range(zz,zz+len_A):
self.tree[j] = arr[j-zz]
flag = True
while zz:
zz //= 2
len_A //= 2
for node in range(zz,zz+len_A):
val1 = self.tree[node*2+1]
val2 = self.tree[node*2+2]
if flag:
self.tree[node] = val1 | val2
else:
self.tree[node] = val1 ^ val2
flag = False
def update(self, start, value):
len_A = (self.tree_size+1)//2
zz = len_A-1+start
self.tree[zz] = value
flag = True
while zz:
zz -= 1
zz //= 2
val1 = self.tree[zz*2+1]
val2 = self.tree[zz*2+2]
if flag:
self.tree[zz] = val1 | val2
else:
self.tree[zz] = val1 ^ val2
flag = False
def solve():
N, M = getInts()
A = getInts()
ttt = SegmentTree(A)
for m in range(M):
P, B = getInts()
ttt.update(P-1,B)
print(ttt.tree[0])
return
solve()
这个想法是建立一个段树,原始数组的每个元素都是一个叶子,每个操作(OR 或 XOR 交替)都是上一层,直到我们到达树的根。
很明显,我没有以最佳方式实现某些东西,因为它仍然无法及时运行最大输入。将我的解决方案与其他人在 Pypy / Python 中的解决方案进行比较,我完全不知道为什么我的解决方案不能及时运行。
提前致谢。
【问题讨论】:
标签: python pypy segment-tree