求助,刚学python,写了一个线段树T掉了,请各位大佬看看
查看原帖
求助,刚学python,写了一个线段树T掉了,请各位大佬看看
69796
林聪楼主2021/1/17 19:07

如题

class tree:
    v = 0
    add = 0
    l = 0
    r = 0


a = [0 for i in range(100010)]
t = [tree() for i in range(400010)]


def build(p, l, r):
    t[p].l = l
    t[p].r = r
    if l == r:
        t[p].v = a[l-1]
        return
    mid = (l + r) >> 1
    build(p*2, l, mid)
    build(p*2+1, mid+1, r)
    t[p].v = t[p*2].v + t[p*2+1].v


def spread(p):
    t[p*2].v += t[p].add * (t[p*2].r - t[p*2].l + 1)
    t[p*2].add += t[p].add
    t[p*2+1].v += t[p].add * (t[p*2+1].r - t[p*2+1].l + 1)
    t[p*2+1].add += t[p].add
    t[p].add = 0


def change(p, l, r, k):
    if l <= t[p].l and t[p].r <= r:
        t[p].v += k * (t[p].r - t[p].l + 1)
        t[p].add += k
        return
    if t[p].add:
        spread(p)
    mid = (t[p].l + t[p].r) >> 1
    if l <= mid:
        change(p*2, l, r, k)
    if mid < r:
        change(p*2+1, l, r, k)
    t[p].v = t[p*2].v + t[p*2+1].v


def check(p, l, r):
    if l <= t[p].l and t[p].r <= r:
        return t[p].v
    if t[p].add:
        spread(p)
    mid = (t[p].l + t[p].r) >> 1
    ans = 0
    if l <= mid:
        ans += check(p*2, l, r)
    if mid < r:
        ans += check(p*2+1, l, r)
    return ans


n, m = input().split()
n = int(n)
m = int(m)
x = input()
a[:] = [int(i) for i in x.split()]
build(1, 1, n)
for i in range(0, m):
    x = input().split()
    if x[0] == "1":
        change(1, int(x[1]), int(x[2]), int(x[3]))
    else:
        print(check(1, int(x[1]), int(x[2])))
2021/1/17 19:07
加载中...