萌新求调线段树python
查看原帖
萌新求调线段树python
357440
NullNone楼主2023/2/2 16:36

runtime error (NZEC)

n = int(input())
a = [-1]+list(map(int, input().split(' ')))


class Node:
    def __init__(self, ans=0, l=0, r=0, _sum=0):
        self.a = ans
        self.l = l
        self.r = r
        self.s = _sum

    def __add__(self, other):
        res = Node()
        res.a = max(self.a, other.a, self.r+other.l)
        res.l = max(self.l, self.s+other.l)
        res.r = max(other.r, self.r+other.s)
        res.s = self.s + other.s
        return res

    def __radd__(self, other):
        res = Node()
        res.a = max(self.a, other.a, other.r+self.l)
        res.l = max(other.l, other.s+self.l)
        res.r = max(self.r, other.r+self.s)
        res.s = self.s + other.s
        return res

    def __repr__(self):
        return 'Node({ans=%d,l=%d,r=%d,_sum=%d})' % (self.a, self.l,
                                                     self.r, self.s)

    def init(self, val):
        if val > 0:
            self.l = self.r = self.a = self.s = val
        else:
            self.s = val

    def get_ans(self):
        return self.a


class SegmentTree:
    def __init__(self):
        self.ns = []
        for i in range(n << 2):
            self.ns.append(Node())

    def init(self, l, r, idx):
        if l == r:
            self.ns[idx].init(a[l])
        else:
            mid = (l+r) >> 1
            self.init(l, mid, idx << 1)
            self.init(mid+1, r, idx << 1 | 1)
            self.ns[idx] = self.ns[idx << 1]+self.ns[idx << 1 | 1]

    def debug(self):
        for i in self.ns:
            print(i)

    def ask(self, st, en, l, r, idx):
        if st <= l and r <= en:
            return self.ns[idx]
        mid = (l+r) >> 1
        if en <= mid:
            return self.ask(st, en, l, mid, idx << 1)
        if st > mid:
            return self.ask(st, en, mid+1, r, idx << 1 | 1)
        return self.ask(st, en, l, mid, idx << 1)+self.ask(st, en, mid+1, r,
                                                           idx << 1 | 1)


s = SegmentTree()
s.init(1, n, 1)
q = int(input())
for i in range(q):
    l, r = tuple(map(int, input().split(' ')))
    print(s.ask(l, r, 1, n, 1).get_ans())

2023/2/2 16:36
加载中...