社区讨论

python3 求助卡常

P3372【模板】线段树 1参与者 5已保存回复 11

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
11 条
当前快照
1 份
快照标识符
@mhixopfb
此快照首次捕获于
2025/11/03 17:24
4 个月前
此快照最后确认于
2025/11/08 07:54
3 个月前
查看原帖
rt。
4545 pts,#818\# 8 \sim 18 TLE。
代码:
PY
n, Q = (int(x) for x in input().split(' '))

a = input().split(' ')
a.insert(0, 0)
sum = [0] * (4 * n + 1)
tag = [0] * (4 * n + 1)

def ls(p) :
    return p << 1

def rs(p) :
    return p << 1 | 1

def psup(p) :
    sum[p] = sum[ls(p)] + sum[rs(p)]

def build(p = 1, L = 1, R = n) :
    if L == R :
        sum[p] = int(a[L])
        return
    
    mid = (L + R) >> 1

    build(ls(p), L, mid)
    build(rs(p), mid + 1, R)
    psup(p)

    return

def work(p, L, R, k) :
    tag[p] += k
    sum[p] += (R - L + 1) * k

    return

def psd(p, L, R) :
    if tag[p] == 0 : 
        return

    mid = (L + R) >> 1

    work(ls(p), L, mid, tag[p]), work(rs(p), mid + 1, R, tag[p])

    tag[p] = 0

    return

def add(l, r, k, p = 1, L = 1, R = n) :
    if l <= L and R <= r :
        work(p, L, R, k)
        
        return
    
    psd(p, L, R)

    mid = (L + R) >> 1

    if l <= mid :
        add(l, r, k, ls(p), L, mid)
    if(r > mid) :
        add(l, r, k, rs(p), mid + 1, R)

    psup(p)

    return

def query(l, r, p = 1, L = 1, R = n) :
    if l <= L and R <= r :
        return sum[p]
    
    res = 0
    mid = (L + R) >> 1

    psd(p, L, R)

    if(l <= mid) :
        res += query(l, r, ls(p), L, mid)
    if(r > mid) :
        res += query(l, r, rs(p), mid + 1, R)

    return res

build()

for i in range(1, Q + 1) :
    tmp = input().split(' ')
    op, l, r = int(tmp[0]), int(tmp[1]), int(tmp[2])

    if op == 1 :
        k = int(tmp[3])
        add(l, r, k)
    else :
        print(query(l, r))

回复

11 条回复,欢迎继续交流。

正在加载回复...