问题描述
我正在尝试以下问题,并且在经过多个小时的多次提交后,我仍然无法及时运行我的解决方案
问题 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中的解决方案进行比较后,我完全为为什么我的解决方案无法及时运行而感到困惑。
谢谢。
解决方法
在与其他人的成功解决方案进行了大量尝试之后,我能够通过添加以下标头代码来进行上述操作:
import sys
reader = (line.rstrip() for line in sys.stdin)
input = reader.__next__
我只能认为这可以加快速度,因为它不必每次都查找input()方法,但是我对这些事情并不是真正的专家,如果有人可以进一步阐明这一点,那么请做。