【问题标题】:Why is my segment tree unable to run in time?为什么我的段树无法及时运行?
【发布时间】: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


    【解决方案1】:

    在尝试了其他人的成功解决方案之后,我能够通过添加以下标头代码来运行上述代码:

    import sys
    reader = (line.rstrip() for line in sys.stdin)
    input = reader.__next__
    

    我只能认为这会加快速度,因为它不必每次都查找 input() 方法,但我真的不是这些事情的专家,如果有人可以进一步阐明这一点请做。

    【讨论】:

    • input() 是一个缓慢的操作,意味着更多地用于交互式使用。例如,即使没有打印提示(至少在 PyPy3 中),它也会刷新标准输出。它还查找并调用自定义挂钩(如果有)。用更简单的东西代替它,比如sys.stdin.readline() 或使用你描述的黑客,会更快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多